我们目前正在管理一个在 Tomcat 8.x 上运行的 Spring Hibernate Web 应用程序,并使用 Atomikos 4.0.4 作为事务管理器。后端数据库是SQL Server。
我们在高负载下进行写入操作时遇到了一个问题,系统偶尔会抛出错误,指出“当 AutoCommit 模式设置为‘true’时,无法调用回滚操作。”这种情况主要是在执行工作负载增加的事务时观察到的。
为了提供额外的上下文,我们的应用程序使用配置如下的 JNDI 连接:
<Resource name="JDBC/test" auth="Container" type="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDrive/>
与此问题相关的错误跟踪如下:
om.microsoft.sqlserver.jdbc.SQLServerException: Cannot invoke a rollback operation when the AutoCommit mode is set to "true".
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:234)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.rollback(SQLServerConnection.java:3198)
at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection.transactionTerminated(AtomikosThreadLocalConnection.java:382)
at com.atomikos.jdbc.nonxa.AtomikosNonXAParticipant.rollback(AtomikosNonXAParticipant.java:146)
at com.atomikos.icatch.imp.TxRollbackOnlyStateHandler.addParticipant(TxRollbackOnlyStateHandler.java:39)
at com.atomikos.icatch.imp.CompositeTransactionImp.addParticipant(CompositeTransactionImp.java:162)
at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection.updateInTransaction(AtomikosThreadLocalConnection.java:196)
at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection.invoke(AtomikosThreadLocalConnection.java:276)
at com.sun.proxy.$Proxy120.prepareStatement(Unknown Source)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:146)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:148)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1940)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1909)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1887)
at org.hibernate.loader.hql.QueryLoader.iterate(QueryLoader.java:525)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.iterate(QueryTranslatorImpl.java:416)
at org.hibernate.engine.query.spi.HQLQueryPlan.performIterate(HQLQueryPlan.java:317)
at org.hibernate.internal.SessionImpl.iterate(SessionImpl.java:1553)
at org.hibernate.query.internal.AbstractProducedQuery.doIterate(AbstractProducedQuery.java:1352)
at org.hibernate.query.internal.AbstractProducedQuery.iterate(AbstractProducedQuery.java:1340)
如果您能提供有关解决此问题的任何帮助或指导,我们将不胜感激。
感谢您的时间和考虑。