标记为状态回滚的事务没有任何明显的原因(Wildfly 11,Hibernate 5.1.10,PostgreSQL 10)

时间:2017-12-13 16:22:25

标签: hibernate postgresql-10 wildfly-11

我们正在从JBoss 4.2.3 GA和MS SQL Server 2008 R2迁移到Wildfly 11和PostgreSQL 10.我们使用Wildfly附带的Hibernate版本(5.1.10.Final)

我们有一个非常复杂的应用程序,我们使用无法自行调试的外部API。我们正在使用此API的EJB远程代理来执行操作。

在一个容器管理事务中使用JPA(实体上的NamedQuery)执行了几个DB-Operations(在Wildfly 11中配置了xa-datasource)。

NamedQuery在大多数情况下都能正常工作,但有一种情况是在日志文件中没有任何明显通知的情况下发生错误。

事务标记为状态回滚,但我不知道为什么。没有例外,没有调试消息,没有。

在这种情况下,对同一个NamedQuery的唯一区别是,在同一事务中,几行之前会从表中删除行。

我们已经遇到了PostgreSQL和我们的应用程序的一些问题,因为PostgreSQL没有像MS SQL Server那样实现标准事务隔离级别“read uncommited”,请参阅https://www.postgresql.org/docs/10/static/transaction-iso.html

我不知道这是否与我的问题有关。

我现在唯一的猜测是外部API或org.jboss.jca.adapters.jdbc.WrapperDataSource中的错误和被抑制异常。

这是Hibernate无法准备语句的相关Stacktrace:

  

引起:org.hibernate.exception.GenericJDBCException:不能   准备声明   org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)     在   org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)     在   org.hibernate.engine.jdbc.internal.StatementPreparerImpl $ StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)     在   org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148)     在   org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1934)     在   org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1903)     在   org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1881)     在org.hibernate.loader.Loader.doQuery(Loader.java:925)at   org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342)     在org.hibernate.loader.Loader.doList(Loader.java:2622)at   org.hibernate.loader.Loader.doList(Loader.java:2605)at   org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2434)at at   org.hibernate.loader.Loader.list(Loader.java:2429)at   org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)at at   org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)     在   org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)     在org.hibernate.internal.SessionImpl.list(SessionImpl.java:1339)at   org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)at   org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606)at at   org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483)     ... 172更多

     

引起:java.sql.SQLException:IJ031070:事务不能   继续:STATUS_MARKED_ROLLBACK at   org.jboss.jca.adapters.jdbc.WrapperDataSource.checkTransactionActive(WrapperDataSource.java:245)     在   org.jboss.jca.adapters.jdbc.WrappedConnection.checkTransactionActive(WrappedConnection.java:1928)     在   org.jboss.jca.adapters.jdbc.WrappedConnection.checkStatus(WrappedConnection.java:1943)     在   org.jboss.jca.adapters.jdbc.WrappedConnection.checkTransaction(WrappedConnection.java:1917)     在   org.jboss.jca.adapters.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:447)     在   org.hibernate.engine.jdbc.internal.StatementPreparerImpl $ 5.doPrepare(StatementPreparerImpl.java:146)     在   org.hibernate.engine.jdbc.internal.StatementPreparerImpl $ StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)     ... 189更多

是否有人知道什么可能导致事务被标记为状态回滚而没有任何通知?

1 个答案:

答案 0 :(得分:0)

我发现了真正的问题。正如已经猜到的那样,有一个被应用程序吞噬的异常并导致事务被设置为状态ROLLBACK。

我发布的堆栈跟踪是一个跟随错误,因为当事务已经设置为ROLLBACK时不允许准备语句(检查WrapperDataSource)。

在将Arjuna的日志级别设置为跟踪后,我终于找到了错误。

由于数据(业务逻辑)的不一致以及SQL Server和PostgreSQL的不同事务/连接配置和行为的出现,引发了真正的异常。但那是一个不同的故事...