连接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代码中启动了连接也有挂起的事务。