连接closures时,未提交的事务会发生什么?
他们是立即回滚? 他们在一段时间后回滚了吗? 他们是否处于未提交状态?
如果使用连接池并且连接重置简单,行为是否相同?
它可以保持开放,而连接池适用。 例如:命令超时可以将locking和TXN留下,因为客户端发送的是“中止”。
2解决scheme:
-
在客户端testing,字面上:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
-
使用
SET XACT_ABORT ON
确保清除TXN: 问题1和问题2
我总是使用SET XACT_ABORT ON
。
从这个SQL团队博客 :
请注意,使用连接池时,仅在没有回滚的情况下closures连接将只返回到池的连接,事务将保持打开状态,直到以后重用或从池中删除。 这可能会导致locking开始不必要,并导致其他超时和滚动块
从MSDN ,“交易支持”(我的大胆)
当一个连接closures时,它将被释放回池中,并根据其事务上下文进入相应的细分。 因此, 即使分布式事务仍在等待 ,您也可以closures连接而不会产生错误。 这允许您稍后提交或中止分布式事务。
未提交的更改在连接之外是不可见的,所以回滚的时间是不相关的。 所以是的,交易最终会回滚。
会话closures时,服务器将立即回滚任何未被取消的交易。
ADO池负责清理任何未完成的交易,然后将交易返回到池中。 如果您处理与未决事务的连接,它将回滚。
事务可以由客户端使用ADO API(SqlConnection.BeginTransaction)或通过执行BEGIN TRANSACTION语句来启动。 客户端和服务器之间的TDS协议有特殊的令牌,通知客户端事务如何开始/提交,所以ADO知道即使在T-SQL代码中启动了连接也有挂起的事务。