当连接关闭时,未提交的事务会发生什么?

问题描述 投票:0回答:3

它们会立即回滚吗? 一段时间后它们会回滚吗? 他们是否处于未承诺的状态?

如果使用连接池并且简单地重置连接,行为是否相同?

sql sql-server transactions connection-pooling
3个回答
28
投票

在应用连接池时它可以保持打开状态。示例:命令超时可以留下锁和 TXN,因为客户端发送为“中止”。

2个解决方案:

  • 在客户端进行测试,字面意思是:

    IF @@TRANCOUNT <> 0 ROLLBACK TRAN

  • 使用

    SET XACT_ABORT ON
    确保 TXN 已清理:问题 1问题 2

我总是用

SET XACT_ABORT ON

来自此 SQL 团队博客

请注意,使用连接池, 只需关闭连接而无需 回滚只会返回 连接到池和 交易将保持开放状态,直到 稍后重新使用或从池中移除。 这可能会导致锁开始被持有 不必要的并导致其他超时 和滚动块

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

当连接关闭时, 释放回池中并进入 根据适当的细分 它的交易上下文。所以, 您可以关闭连接而无需 产生错误,即使 分布式事务依然 待办的。这允许您提交或 中止分布式事务 稍后再说。


9
投票

会话关闭时,服务器将立即回滚任何未提交的事务。
ADO 池负责在将事务返回到池之前清除任何未提交的事务。如果您处置带有待处理事务的连接,它将回滚。

客户端可以使用 ADO API (

SqlConnection.BeginTransaction
) 或通过执行
BEGIN TRANSACTION
语句来启动事务。客户端和服务器之间的 TDS 协议具有特殊标记,在事务启动/提交时通知客户端,这样 ADO 就知道连接有待处理的事务,即使它们是在 T-SQL 代码中启动的。


8
投票

未提交的更改在连接外部不可见,因此回滚的时间无关紧要。所以是的,交易最终会回滚。

© www.soinside.com 2019 - 2024. All rights reserved.