如果调用了close方法,并且有一个活跃的事务,那么活跃的事务会怎样呢?它们会被提交还是回滚?
最佳答案
除了另一个答案之外,我还在 Oracle 和 SQL Server(我目前正在使用的数据库)上测试了行为。
MSSQL 回滚 事务。这是您的直觉预期。
甲骨文在另一边,提交交易。这记录在他们的 JDBC Guide 中。 :
如果自动提交模式被禁用,并且您在没有明确提交或回滚您的最后更改的情况下关闭连接,则会运行隐式 COMMIT 操作。
当然,JDBC 规范允许您自由选择任何一种方式,但我个人认为隐式提交事务是一个糟糕的设计选择。作为一个论点,考虑一个线程的用例,该线程正忙于处理一个长事务并且不响应关闭请求。当应用程序最终关闭连接池时,这将依次关闭连接,提交未完成的事务!
这个故事的寓意是,连接池实现必须始终在手动提交模式下关闭连接之前调用 rollback()。然而,这并不是在实现连接池时才想到的。例如,参见 PooledConnectionImpl from DBCP
关于java - 连接关闭时 Activity 事务的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6562609/