将嵌套存储过程放在事务中

时间:2013-11-15 11:37:47

标签: 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会改变方法吗?如果有人与我正在尝试做的事情有任何良好的联系,这将是伟大的

3 个答案:

答案 0 :(得分:0)

我对SQL不是很熟悉,但我对如何处理这个问题的想法是

BEGIN TRY

END TRY
BEGIN CATCH

END CATCH

然后将THROW错误返回给调用存储过程,或者使用OUT param确定存储过程是否成功完成。然后让调用程序根据OUT参数决定他们想要做什么。

这是使用TRY ... CATCH的链接。 http://technet.microsoft.com/en-us/library/ms179296(v=sql.105).aspx

答案 1 :(得分:0)

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

此事务将包含从主过程调用的所有过程。

答案 2 :(得分:0)

您也可以尝试使用SET ARITHABORT ON;。另请参阅this

解决方案可以使用ARITHABORT + WITH RECOMPILE。