连接关闭时活动事务的行为?

时间:2011-07-03 11:31:30

标签: java jdbc

如果调用close方法且存在活动事务,活动事务会发生什么?他们会被提交还是回滚?

2 个答案:

答案 0 :(得分:3)

添加到另一个答案,我测试了Oracle和SQL Server上的行为,我正在使用的数据库。

MSSQL 回滚该事务。这是你直觉所期望的。

Oracle另一方面,提交该事务。这在JDBC Guide

中有记录

如果禁用自动提交模式并关闭连接而未显式提交或回滚上次更改,则会运行隐式COMMIT操作。

当然,JDBC规范为您提供了自由选择,但我个人认为隐含地提交事务是一个糟糕的设计选择。作为一个参数,考虑一个线程的用例,该线程忙于处理长事务并且不响应关闭请求。当应用程序最终关闭连接池时,这将关闭连接,提交未完成的事务!

这个故事的寓意是连接池实现必须始终在手动提交模式下关闭连接之前调用rollback()。但是,在实现连接池时,这不是我想到的。例如,请参阅PooledConnectionImpl from DBCP

答案 1 :(得分:1)

来自Connection.close()的javadoc:

强烈建议应用程序在调用close方法之前显式提交或回滚活动事务。 如果调用close方法并且存在活动事务,则结果是实现定义的。