Sql 将嵌套存储过程放入事务中

Sql 将嵌套存储过程放入事务中,sql,tsql,stored-procedures,transactions,sql-server-2008-r2,Sql,Tsql,Stored Procedures,Transactions,Sql Server 2008 R2,我遇到了一个有点混乱的情况,一个SP#1调用SP#2,后者调用SP#3。我发现#3在某些情况下出现瓶颈,导致超时,因此#3只完成了一半的工作。我删除了一个视图,即它正在使用并直接从表中读取,这大大减少了执行时间,并且提高了不再发生这种情况的可能性。但是,如果它再次发生,并且#3次超时,我希望能够回滚在sp 1、2和3中完成的所有工作 我对Sql非常缺乏经验,这只是将#1放在一个事务中的一种情况,它将围绕所有内容,还是嵌套的sp会改变方法?如果有人能找到我想做的事情的好链接,那就太好了我对SQL也

我遇到了一个有点混乱的情况,一个SP#1调用SP#2,后者调用SP#3。我发现#3在某些情况下出现瓶颈,导致超时,因此#3只完成了一半的工作。我删除了一个视图,即它正在使用并直接从表中读取,这大大减少了执行时间,并且提高了不再发生这种情况的可能性。但是,如果它再次发生,并且#3次超时,我希望能够回滚在sp 1、2和3中完成的所有工作


我对Sql非常缺乏经验,这只是将#1放在一个事务中的一种情况,它将围绕所有内容,还是嵌套的sp会改变方法?如果有人能找到我想做的事情的好链接,那就太好了

我对SQL也不是很有经验,但我对如何处理这个问题的想法是

BEGIN TRY

END TRY
BEGIN CATCH

END CATCH
然后,
将错误抛出
回调用存储过程,或者使用一个
OUT
参数来确定存储过程是否成功完成。然后让调用过程根据
OUT
param决定他们想要做什么

这里是使用TRY…CATCH的链接

开始交易
执行程序@arg1=“foo”、@arg2=“bar”
如果@错误0
开始
回降
RAISERROR('Error',16,1)
返回
结束
提交——如果没有错误,将运行此操作
此事务将包含从主过程调用的所有过程。

您也可以尝试使用。另见


解决方案可以使用ARITHABORT+和重新编译。

也可以找到可能有帮助的方法。这种方法似乎是最直接的。有兴趣看看是否有人阅读同意它。我现在正试着测试它
begin transaction
exec procedure @arg1 = "foo", @arg2 = "bar"

IF @@ERROR <> 0
BEGIN
ROLLBACK
RAISERROR ('Error', 16,1)
RETURN
END 

commit --this will run if no errors