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



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

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

在一个容器管理的事务(在 Wildfly 11 中配置的 xa 数据源)中使用 JPA(实体上的 NamedQuery)执行了多个数据库操作。

NamedQuery 在大多数情况下工作正常,但有一种情况会发生错误,日志文件中没有任何可见通知。

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

在此方案中,与同一 NamedQuery 的唯一区别是,在同一事务中,行在几个步骤之前从表中删除。

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

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

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

这是相关的堆栈跟踪,Hibernate无法准备语句:

原因: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) at org.hibernate.loader.Loader.doQuery(Loader.java:925) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342) at 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 org.hibernate.loader.Loader.list(Loader.java:2429) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371) 在 org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) at 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 org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483) ...172 更多

原因:java.sql.SQLException: IJ031070:事务无法 继续:STATUS_MARKED_ROLLBACK 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 更多

anone是否知道什么可能导致交易在没有任何通知的情况下被标记为状态回滚?

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

我发布的堆栈跟踪是以下错误,因为当事务已设置为 ROLLBACK 时,不允许准备语句(在 WrapperDataSource 中签入)。

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

真正的异常是由于数据(业务逻辑)的不一致而引发的,并且来自SQL Server和PostgreSQL的不同事务/连接配置和行为。但那是另一回事了...

最新更新