难道他们立即回滚? 是他们的一段时间后回滚? 他们说的是一个未提交状态留?
是行为一样,如果使用连接池和连接只需要简单复位?
难道他们立即回滚? 是他们的一段时间后回滚? 他们说的是一个未提交状态留?
是行为一样,如果使用连接池和连接只需要简单复位?
而连接池应用它可以保持打开状态。 例如:因为客户端发送的“中止”命令超时可以离开锁和TXN。
2个解决方案:
测试客户端,从字面上:
IF @@TRANCOUNT <> 0 ROLLBACK TRAN
使用SET XACT_ABORT ON
,以确保一个TXN被清除: 问题1和问题2
我总是用SET XACT_ABORT ON
。
从这个SQL团队博客 :
请注意,连接池,只需关闭不回滚的连接将只返回到池中,交易将继续开放,直到后来再利用或从池中删除的连接。 这可能会导致锁开始保持不必要的,并且会导致其它超时和滚动块
从MSDN ,部分“事务支持”(我的粗体)
当连接关闭时,它被释放回池和成基于其事务上下文适当的细分。 因此,你可以关闭不产生错误的连接, 即使分布式事务仍悬而未决。 这使您可以提交或在稍后的时间中止分布式事务。
未提交的修改不是连接的外部可见,所以回滚的时间是无关紧要的。 所以,是的,该交易最终被回滚。
当会话被关闭,服务器将immedeatly回滚的任何未提交的事务。
反兴奋剂池是承担一切事务返回到池之前清除任何未提交的事务。 如果处理未决的交易连接时,它会回滚。
事务可以通过使用ADO API(SqlConnection.BeginTransaction)客户端或通过执行BEGIN TRANSACTION语句来启动。 客户端和服务器之间的TDS协议有特殊标记,通知客户在事务开始/ COMMITED这样使ADO知道连接已经挂起的交易,即使他们是在T-SQL代码的开始。