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

M S*_*ach 5 java jdbc

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

Bog*_*mac 5

除了另一个答案之外,我还测试了我当前正在使用的数据库 Oracle 和 SQL Server 上的行为。

MSSQL回滚事务。这就是您直觉上所期望的。

Oracle 在另一端提交事务。这在他们的JDBC 指南中有记录:

如果自动提交模式被禁用并且您关闭连接而没有显式提交或回滚最后的更改,则会运行隐式 COMMIT 操作。

当然,JDBC 规范让您可以自由选择任何一种方式,但我个人认为隐式提交事务是一个糟糕的设计选择。作为一个论点,请考虑一个线程的用例,该线程正忙于处理较长的事务并且不响应关闭请求。当应用程序最终关闭连接池时,这将依次关闭连接,提交未完成的事务!

这个故事的寓意是,在手动提交模式下关闭连接之前,连接池实现必须始终调用 rollback()。然而,这并不是在实现连接池时才想到的。作为示例,请参阅DBCP 中的 PooledConnectionImpl


MRa*_*ser 1

来自 javadoc Connection.close()

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