他们是否立即回滚? 它们会在一段时间后回滚吗? 他们是否处于未提交状态?
如果使用连接池并且只是重置连接,行为是否相同?
答案 0 :(得分:24)
当连接池适用时,它可以保持打开状态。示例:命令超时可以保留锁和TXN,因为客户端发送为“abort”。
2个解决方案:
在客户端测试,字面意思是:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
使用SET XACT_ABORT ON
确保清理TXN:Question 1和Question 2
我总是使用SET XACT_ABORT ON
。
请注意,使用连接池时, 只需关闭连接即可 回滚只会返回 连接到游泳池和 交易将一直开放,直到 之后重新使用或从池中删除。 这可能导致锁定开始 不必要的并导致其他超时 和滚动块
来自MSDN,“交易支持”部分(我的粗体)
当连接关闭时,它就是 释放回游泳池进入 基于的适当细分 它的交易背景。因此, 你可以不用关闭连接 生成错误,即使a 分布式交易仍然存在 悬而未决。这允许你提交或 中止分布式事务 以后的时间。
答案 1 :(得分:9)
未提交的更改在连接外部不可见,因此回滚的时间无关紧要。所以是的,交易最终会回滚。
答案 2 :(得分:6)
当会话关闭时,服务器将立即回滚任何未通信的事务 在将事务返回到池之前,ADO池可用于清除任何未通信的事务。如果您处置与挂起事务的连接,它将回滚。
客户端可以使用ADO API(SqlConnection.BeginTransaction)或执行BEGIN TRANSACTION语句来启动事务。客户端和服务器之间的TDS协议具有特殊的令牌,通知客户端何时启动/提交事务,因此ADO知道连接具有挂起的事务,即使它们是以T-SQL代码启动的。