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

Posted

技术标签:

【中文标题】当连接关闭时,未提交的事务会发生啥?【英文标题】:What happens to an uncommitted transaction when the connection is closed?当连接关闭时,未提交的事务会发生什么? 【发布时间】:2010-12-05 02:29:44 【问题描述】:

它们会立即回滚吗? 他们是否在一段时间后回滚? 他们是否处于未提交状态?

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

【问题讨论】:

相关:***.com/q/4978372/1569 【参考方案1】:

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

2 个解决方案:

在客户端测试,字面意思:

IF @@TRANCOUNT <> 0 ROLLBACK TRAN

使用SET XACT_ABORT ON 确保清理TXN:Question 1 和Question 2

我总是使用SET XACT_ABORT ON

来自this SQL Team blog:

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

来自MSDN,“交易支持”部分(我的粗体字)

当一个连接关闭时,它是 释放回池中并进入 基于适当的细分 它的事务上下文。所以, 您可以关闭连接而无需 生成错误,即使 分布式事务仍然 待办的。这允许您提交或 中止分布式事务 稍后。

【讨论】:

连接池发生在客户端,所以如果客户端在内部中止连接而没有真正关闭它,那么它负责发出回滚或做任何需要解决这种情况的事情。 @Fozi:除非你设置 XACT_ABORT ON。 @gbn : 指向 sql 团队和 msdn 的链接现在是死链接【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

但它可能会挂起其他连接(等待提交/回滚),具体取决于您的隔离,因此时间仍然很重要。 正确,但重点是“最终”,这是坏事 我猜一旦知道 TCP(或其他)连接已关闭/中断,它就会回滚。有关连接池,请参阅 gbn 的答案。 除非您在其他地方使用 NOLOCK 或 ISOLATION LEVEL READ UNCOMMITTED。 我正在使用这个ISOLATION LEVEL READ UNCOMMITTED 我未提交的更改会在新连接上被读取吗?

以上是关于当连接关闭时,未提交的事务会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

当 JDBC AutoCommit 为 False 且未设置显式事务边界时会发生啥

在SP呼叫之后,当连接丢失时MSSQL会发生什么?

3G 换塔时 TCP 连接会发生啥? [关闭]

在关闭pl/sql之前未提交的事物,会不会被默认提交?

记一次排查mysql数据库连接未关闭问题的过程

sqlworkbench-j 不关闭事务连接