【发布时间】:2021-12-25 03:26:43
【问题描述】:
我有一个包含事务的 TRY/CATCH 块,我想根据执行存储过程的结果回滚。
BEGIN TRY
BEGIN TRAN
INSERT Record
--Business validation
EXEC StoredProcedure --This should throw error
PRINT 'Commit Tran'
COMMIT TRAN
END TRY
BEGIN CATCH
PRINT 'In CATCH Block'
ROLLBACK TRAN;
END CATCH
PRINT 'After END CATCH'
在我的测试中,插入记录已提交,存储过程按预期失败,未打印 PRINT 'COMMIT Tran',代码被发送到 CATCH 块并出现以下错误:"The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION."
如果我将 EXEC StoredProcedure 替换为设计为失败的 INSERT,则原始 INSERT 不会提交,并且 CATCH 块中的 ROLLBACK 可以正常运行而没有错误。
所以问题是 EXEC StoredProcedure 如何影响事务,我该如何解决这个问题?
【问题讨论】:
-
在您流程的每个步骤中,
@@TRANCOUNT的值是多少?尝试添加PRINT语句来捕获这些 - 它可能有助于说明正在发生的事情 -
您说“INSERT 记录已提交”-您能否在代码中显示您确定的位置?另外,您的存储过程如何出错:是
THROW还是RAISERROR,该过程中是否有事务控制语句? -
@paneerakbari 1)
@@TRANCOUNTsays 在 INSERT 记录之后有 1 个事务,在 CATCH 块中有 0 个事务。 2)我说“插入记录已提交”,因为在过程失败后记录仍保留在表中。 3)RAISERROR的存储过程错误,并且该过程中没有事务控制
标签: sql-server tsql