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

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

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

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

另一方面,Oracle 提交交易。 这在他们的JDBC指南中有记录 :

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

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

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

Connection.close()的javadoc:

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