微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何针对 junit 测试用例忽略内存数据库的自定义查询更新的跳过锁定

如何解决如何针对 junit 测试用例忽略内存数据库的自定义查询更新的跳过锁定

我正在编写在内存 h2 数据库中配置的 junit 测试用例。我正在测试的功能实际上是从数据库中挑选一些记录并对这些记录进行一些处理。当代码选择记录时,它会锁定这些记录以进行更新,以便其他进程无法访问这些记录。这东西工作正常,但这会导致测试用例出现问题,因为我在内存数据库中使用测试用例。我该如何解决这个问题。

  @Transactional(propagation = Propagation.MANDATORY)
  @Query(value = "select * from employee where account_id = ?1 limit ?2 for update skip locked",nativeQuery = true)
  public List<Employee> getEmployeesByAccountId(String accountId,Integer limit);

请参阅上面的代码,这会导致测试用例出现问题..

错误

    Caused by:
    org.hibernate.exception.sqlGrammarException: Could not prepare statement
        at org.hibernate.exception.internal.sqlExceptionTypeDelegate.convert(sqlExceptionTypeDelegate.java:63)
        at org.hibernate.exception.internal.StandardsqlExceptionConverter.convert(StandardsqlExceptionConverter.java:42)
        at org.hibernate.engine.jdbc.spi.sqlExceptionHelper.convert(sqlExceptionHelper.java:113)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:151)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2104)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2034)
        at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2012)
        at org.hibernate.loader.Loader.doQuery(Loader.java:953)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
        at org.hibernate.loader.Loader.doList(Loader.java:2815)
        at org.hibernate.loader.Loader.doList(Loader.java:2797)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2629)
        at org.hibernate.loader.Loader.list(Loader.java:2624)
        at org.hibernate.loader.custom.Customloader.list(Customloader.java:338)
        at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2123)
        at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1134)
        at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:173)
        at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1526)
        at org.hibernate.query.Query.getResultList(Query.java:165)
        at org.springframework.data.jpa.repository.query.JpaQueryExecution$CollectionExecution.doExecute(JpaQueryExecution.java:126)
        at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88)
        at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:154)
        at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:142)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:618)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
        ... 19 more

        Caused by:
        org.h2.jdbc.JdbcsqlSyntaxErrorException: Syntax error in sql statement "SELECT * FROM EMPLOYEE WHERE ACCOUNT_ID = ? LIMIT ? FOR UPDATE SKIP[*] LOCKED"; sql statement:
        select * from employee where account_id = ? limit ? for update skip locked [42000-200]
            at org.h2.message.DbException.getJdbcsqlException(DbException.java:453)
            at org.h2.message.DbException.getJdbcsqlException(DbException.java:429)
            at org.h2.message.DbException.get(DbException.java:205)
            at org.h2.message.DbException.get(DbException.java:181)
            at org.h2.message.DbException.getSyntaxError(DbException.java:229)
            at org.h2.command.Parser.getSyntaxError(Parser.java:1051)
            at org.h2.command.Parser.prepareCommand(Parser.java:741)
            at org.h2.engine.Session.prepareLocal(Session.java:657)
            at org.h2.engine.Session.prepareCommand(Session.java:595)
            at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1235)
            at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:76)
            at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:352)
            at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:316)
            at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
            at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
            at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176)

谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。