由于关闭连接,Spring事务不会回滚

时间:2015-10-02 22:34:34

标签: java spring oracle jdbc ojdbc

我有一个非常大的交易,用@Transactional注释。其中有一些长时间运行的查询,但通常运行正常。大约20%的时间Connection似乎在事务之外被强制关闭,并且当事务尝试继续工作时,它会因以下堆栈跟踪而失败。更糟糕的是,交易没有回滚。

默认情况下,JDBC在连接关闭时提交。但是,Spring应该在打开事务(Spring @Transactional and JDBC autoCommit)之前使用类似下面的内容将Connection的自动提交设置为false。我已经确认我们使用的版本仍然会这样做。我们使用SimpleJdbcTemplate来执行查询,并从Apache Commons DBCP池中获取连接。

这是DBCP认为连接是否陈旧的问题(因为事务中有一些长时间运行的查询),所以池试图回收连接,一路上提交它?不应该autocommit = false阻止这个吗?有人有任何其他建议吗?

由于

使用(全部很旧):

SpringJDBC 2.5
Oracle JDBC Drivers 11.1.0.7 (ojdbc6)
Apache Commons DBCP 1.2.1

堆栈追踪:

Activity threw exception: 
org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is java.sql.SQLException: Connection oracle.jdbc.driver.T4CConnection@56a2191a is closed.
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:279)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:800)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:777)
at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThrowing(TransactionAspectSupport.java:339)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
[...]
Caused by: java.sql.SQLException: Connection oracle.jdbc.driver.T4CConnection@56a2191a is closed.
at org.apache.commons.dbcp.DelegatingConnection.checkOpen(DelegatingConnection.java:398)
at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:368)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.rollback(PoolingDataSource.java:323)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doRollback(DataSourceTransactionManager.java:276)
... 21 more

0 个答案:

没有答案