我有点混乱的情况,SP#1调用SP#2调用SP#3。在某些情况下我发现#3的瓶颈导致超时,所以#3只完成了一半的工作。我放弃了它正在使用和直接从表中读取的视图,这大大减少了执行时间,并且有可能改善它不会再发生。如果它确实再次发生,并且#3次超时,我希望能够回滚在sp 1,2和3中完成的所有工作。
我对Sql缺乏经验,这只是一个将#1置于事务中的情况,它将包围所有内容或者嵌套sp会改变方法吗?如果有人与我正在尝试做的事情有任何良好的联系,这将是伟大的
答案 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。