当连接被关闭发生未提交的事务是什么?(What happens to an uncommitted

2019-07-21 13:56发布

难道他们立即回滚? 是他们的一段时间后回滚? 他们说的是一个未提交状态留?

是行为一样,如果使用连接池和连接只需要简单复位?

Answer 1:

而连接池应用它可以保持打开状态。 例如:因为客户端发送的“中止”命令超时可以离开锁和TXN。

2个解决方案:

  • 测试客户端,从字面上:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • 使用SET XACT_ABORT ON ,以确保一个TXN被清除: 问题1和问题2

我总是用SET XACT_ABORT ON

从这个SQL团队博客 :

请注意,连接池,只需关闭不回滚的连接将只返回到池中,交易将继续开放,直到后来再利用或从池中删除的连接。 这可能会导致锁开始保持不必要的,并且会导致其它超时和滚动块

从MSDN ,部分“事务支持”(我的粗体)

当连接关闭时,它被释放回池和成基于其事务上下文适当的细分。 因此,你可以关闭不产生错误的连接, 即使分布式事务仍悬而未决。 这使您可以提交或在稍后的时间中止分布式事务。



Answer 2:

未提交的修改不是连接的外部可见,所以回滚的时间是无关紧要的。 所以,是的,该交易最终被回滚。



Answer 3:

当会话被关闭,服务器将immedeatly回滚的任何未提交的事务。
反兴奋剂池是承担一切事务返回到池之前清除任何未提交的事务。 如果处理未决的交易连接时,它会回滚。

事务可以通过使用ADO API(SqlConnection.BeginTransaction)客户端或通过执行BEGIN TRANSACTION语句来启动。 客户端和服务器之间的TDS协议有特殊标记,通知客户在事务开始/ COMMITED这样使ADO知道连接已经挂起的交易,即使他们是在T-SQL代码的开始。



文章来源: What happens to an uncommitted transaction when the connection is closed?