2011-07-03 31 views
4

如果调用close方法并且存在活动事务,那么活动事务会发生什么情况?他们会被提交还是回滚?连接关闭时活动事务的行为?

+1

我对'JDBC'没有特别的经验,所以不会提供这个答案,但如果没有发送'commit'并且连接关闭,那么'rollback'只会是逻辑的,不是吗? – Nanne

回答

1

Connection.close()的Javadoc:

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

3

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

MSSQL 回滚该交易。这是你直觉上期望的。

Oracle在另一边,提交该交易。这在JDBC Guide中有记录:

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

当然,JDBC规范给你自由去任何一种方式,但我个人认为暗中提交事务是一个糟糕的设计选择。作为一个参数,考虑忙于处理long-ish事务并且不响应关闭请求的线程的用例。当应用程序最终关闭连接池时,这将依次关闭连接,提交未完成的事务!

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