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

SQL Server中事务回滚生效但仍报错的原因排查

问题:事务回滚生效但仍报COMMIT错误的原因?

我在SQL Server Management Studio中执行以下T-SQL代码:

BEGIN TRAN;

DELETE FROM [TestDB].[dbo].[TestTable];

IF @@ROWCOUNT > 1
BEGIN
    ROLLBACK COMMIT;
END
ELSE
BEGIN
    COMMIT TRAN;
END

由于TestTable中的行数大于1,ROLLBACK COMMIT;语句被执行。表数据未被清空说明回滚已生效,但仍报出如下错误:

(13 rows affected)
Msg 3902, Level 16, State 1, Line 5
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

明明功能符合预期,为何会出现该错误?

原因分析与解决方案

错误根源

问题出在ROLLBACK COMMIT;这条语句上——SQL Server会将其解析成两个独立的指令:先执行ROLLBACK完成事务回滚,再执行COMMIT。

当ROLLBACK执行完毕,当前事务已经被彻底终止,后续的COMMIT找不到对应的BEGIN TRANSACTION,因此抛出3902号错误。虽然回滚的效果已经达成,但多余的COMMIT指令触发了报错。

正确写法

只需要保留ROLLBACK指令即可,无需额外添加COMMIT:

BEGIN TRAN;

DELETE FROM [TestDB].[dbo].[TestTable];

IF @@ROWCOUNT > 1
BEGIN
    ROLLBACK; -- 仅保留ROLLBACK指令
END
ELSE
BEGIN
    COMMIT TRAN;
END

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:07:06