连接关闭后,未提交的事务会发生什么?

时间:2009-10-08 18:12:24

标签: sql sql-server transactions connection-pooling

他们是否立即回滚? 它们会在一段时间后回滚吗? 他们是否处于未提交状态?

如果使用连接池并且只是重置连接,行为是否相同?

3 个答案:

答案 0 :(得分:24)

当连接池适用时,它可以保持打开状态。示例:命令超时可以保留锁和TXN,因为客户端发送为“abort”。

2个解决方案:

  • 在客户端测试,字面意思是:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • 使用SET XACT_ABORT ON确保清理TXN:Question 1Question 2

我总是使用SET XACT_ABORT ON

来自this SQL Team blog

  

请注意,使用连接池时,   只需关闭连接即可   回滚只会返回   连接到游泳池和   交易将一直开放,直到   之后重新使用或从池中删除。   这可能导致锁定开始   不必要的并导致其他超时   和滚动块

来自MSDN,“交易支持”部分(我的粗体)

  

当连接关闭时,它就是   释放回游泳池进入   基于的适当细分   它的交易背景。因此,   你可以不用关闭连接   生成错误,即使a   分布式交易仍然存在   悬而未决。这允许你提交或   中止分布式事务   以后的时间。

答案 1 :(得分:9)

未提交的更改在连接外部不可见,因此回滚的时间无关紧要。所以是的,交易最终会回滚。

答案 2 :(得分:6)

当会话关闭时,服务器将立即回滚任何未通信的事务 在将事务返回到池之前,ADO池可用于清除任何未通信的事务。如果您处置与挂起事务的连接,它将回滚。

客户端可以使用ADO API(SqlConnection.BeginTransaction)或执行BEGIN TRANSACTION语句来启动事务。客户端和服务器之间的TDS协议具有特殊的令牌,通知客户端何时启动/提交事务,因此ADO知道连接具有挂起的事务,即使它们是以T-SQL代码启动的。