【问题标题】:Putting nested stored procedures in a transaction将嵌套存储过程放入事务中
【发布时间】:2013-11-15 11:37:47
【问题描述】:

我的情况有点混乱,SP #1 调用 SP #2,SP #2 又调用 SP #3。在某些情况下,我发现#3 存在瓶颈,导致超时,因此#3 只完成了一半的工作。我取消了它正在使用并直接从表中读取的观点,这大大减少了执行时间,并且很有可能不会再次发生。但是,如果它确实再次发生并且 #3 超时,我希望能够回滚在 sp 1,2 和 3 中完成的所有工作。

我对 Sql 非常缺乏经验,这只是将#1 放在一个将环绕所有内容的事务中,还是嵌套 sp 会改变方法?如果有人对我正在尝试做的事情有任何好的链接,那就太好了

【问题讨论】:

标签: sql tsql stored-procedures transactions sql-server-2008-r2


【解决方案1】:

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

BEGIN TRY

END TRY
BEGIN CATCH

END CATCH

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

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

【讨论】:

    【解决方案2】:
    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
    

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

    【讨论】:

    • 这种方法似乎是最直接的。有兴趣看看是否有人阅读同意。我现在正在尝试测试它
    【解决方案3】:

    您也可以尝试使用SET ARITHABORT ON;。另见this

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      相关资源
      最近更新 更多