【发布时间】:2017-12-13 16:22:24
【问题描述】:
我们正在从 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)执行了多个 DB 操作。
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 未能准备语句的相关 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) 在 org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:342) 在 org.hibernate.loader.Loader.doList(Loader.java:2622) 在 org.hibernate.loader.Loader.doList(Loader.java:2605) 在 org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2434) 在 org.hibernate.loader.Loader.list(Loader.java:2429) 在 org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501) 在 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) 在 org.hibernate.internal.QueryImpl.list(QueryImpl.java:87) 在 org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:606) 在 org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:483) ... 172 更多
原因:java.sql.SQLException: IJ031070: Transaction cannot 继续: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 更多
有没有人知道什么可能导致事务在没有任何通知的情况下被标记为状态回滚?
【问题讨论】:
-
我想我现在知道错误了。由于 PostgreSQL 没有实现事务隔离级别 READ_UNCOMMITED,另一个后台有状态 EJB 无法读取数据。正在读取大量数据,在我将事务属性从 NOT_SUPPORTED 设置为 REQUIRED 以解决另一个问题之后,必须读取同一事务中未提交的数据。我猜是非常奇怪的设计,必须重构。
标签: hibernate postgresql-10 wildfly-11