回滚整个存储过程

Posted

技术标签:

【中文标题】回滚整个存储过程【英文标题】:Rollback an entire stored procedure 【发布时间】:2016-09-10 12:39:17 【问题描述】:

我有一个包含多个更新语句的存储过程。我不想使用 try catch。如何回滚存储过程并取回原始表?

这样的东西能行吗-

开始交易 t1 spName 回滚事务 t1

【问题讨论】:

您可以将存储过程的主体包装在单个事务中。 你为什么不想使用try catch。除了让您调试语法问题之外,您的 proc 基本上什么都不做。 存储过程中的查询将通过作业每周触发。现在在测试执行存储prc后是否要取回原始表时,如何取回原始表? #scsimon 你是对的,但我的要求是别的 【参考方案1】:

是的,您可以将所有内容都包装到一个存储过程中到一个事务中

begin tran
exec testproc

commit tran
--rollback tran --for condition

即使对于提交和回滚也能正常工作

如果在存储过程中你需要打开另一个事务那么你需要捕获

DECLARE @vTranCount   INT = @@TRANCOUNT

--Commit
IF (@vTranCount = 0 AND @@TRANCOUNT <> 0) COMMIT TRANSACTION --Commit if the Tran is created by this sproc

--rollback during catch
IF(@vTranCount = 0 AND @@TRANCOUNT > 0) ROLLBACK TRANSACTION --Rollback if the Tran is created by this sproc

【讨论】:

以上是关于回滚整个存储过程的主要内容,如果未能解决你的问题,请参考以下文章

事务、存储过程和 PDO

存储过程中的 SET XACT_ABORT ON 和事务

在存储过程中写SET XACT_ABORT ON 有什么用,不写会发生什么问题

第五天,存储过程,查询区分大小,事务处理(回滚,提交)

sql server存储过程回滚事务

mysql基础教程-----事务视图存储过程和函数流程控制