You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行含多事务SQL脚本中途断连,SQL Server如何处理?

SQL Server 断开连接时的事务处理逻辑

这个问题戳中了批量事务脚本的痛点,我结合实际运维和官方逻辑给你讲明白:

首先得明确一个核心:SQL Server 是按「事务」而非「整个脚本」来处理的,连接断开后的行为完全取决于当前事务的状态,以及脚本里事务的定义方式:

  • 自动提交模式(默认)
    这是最常用的模式,每个单独的SQL语句就是一个独立事务,执行完成后自动提交。如果断开连接时:

    • 已经执行完的语句(事务)会保留,因为已经自动提交了;
    • 正在执行的语句会被立即回滚;
    • 脚本里还没来得及执行的剩余语句,因为会话已经终止,根本不会被服务器接收和执行。
  • 显式事务(BEGIN TRANSACTION 启动)
    如果你用BEGIN TRANSACTION明确开启了事务,直到COMMIT才提交:

    • 若断开连接时,当前显式事务还没执行到COMMIT,整个事务会被自动回滚;
    • 脚本里已经提交过的显式事务会保留;
    • 还没开始执行的后续事务(或语句)直接终止,不会运行。
      举个例子:脚本里有3个显式事务,第一个COMMIT了,第二个正在执行UPDATE时断连,第三个还没开始。结果就是第一个事务的修改保留,第二个全部回滚,第三个根本不会执行。
  • 隐式事务(SET IMPLICIT_TRANSACTIONS ON)
    这种模式下,执行DML语句(INSERT/UPDATE/DELETE)会自动启动事务,直到你手动COMMIT或ROLLBACK:

    • 断开连接时,所有未提交的隐式事务都会被回滚;
    • 已经提交的事务保留,未执行的语句终止。

另外补充个细节:SQL Server的会话清理机制会快速检测到失效连接,不会让未提交的事务长时间占用锁或资源,一定会完成回滚操作。

总结来说:脚本不会继续执行,已经提交的事务(不管是自动提交还是显式提交)会保留,正在执行的未提交事务会被回滚,剩余未执行的部分直接终止。

内容的提问来源于stack exchange,提问作者Mark Roworth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:58:02