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
相关产品推荐
相关产品推荐

