【问题标题】:Executing a stored procedure inside BEGIN/END TRANSACTION在 BEGIN/END TRANSACTION 中执行存储过程
【发布时间】:2010-09-15 20:33:10
【问题描述】:

如果我在 SQL 中创建一个存储过程并在 BEGIN/END TRANSACTION 中调用它 (EXEC spStoredProcedure),这个其他存储过程是否也属于该事务?

我不知道它是否像 C# 中的 try/catch 一样工作。

【问题讨论】:

    标签: sql sql-server stored-procedures rollback sqltransaction


    【解决方案1】:

    听起来不错,非常感谢。我最终做了这样的事情(因为我在 05)

        BEGIN TRY
           BEGIN TRANSACTION
    
           DO SOMETHING
    
           COMMIT
        END TRY
        BEGIN CATCH
          IF @@TRANCOUNT > 0
             ROLLBACK
    
          -- Raise an error with the details of the exception
          DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
          SELECT @ErrMsg = ERROR_MESSAGE(),
                 @ErrSeverity = ERROR_SEVERITY()
    
          RAISERROR(@ErrMsg, @ErrSeverity, 1)
        END CATCH
    

    【讨论】:

    【解决方案2】:

    正如ChrisJames 提到的,在处理嵌套事务时需要小心。 Don PetersonSQL Server Central 上有一组关于交易主题的非常好的文章,我建议您阅读一下:

    这里有:

    【讨论】:

    • 不错的文章,但我认为它可能是一篇旧文章,因为它是在 2004 年写的,但在主题上仍然有很多相关性
    【解决方案3】:

    @Chris,我不知道。

    在谷歌上搜索更多信息时,我遇到了this - 您可以设置“保存点”,无需回滚整个事务即可回滚。

    在这种情况下可能很有用。

    【讨论】:

      【解决方案4】:

      正如 Chris 所说,您应该小心回滚事务。

      具体如下:

      IF @@TRANCOUNT > 0 ROLLBACK
      

      并不总是你想要的。你可以这样做

      IF(@@TRANCOUNT = 1) ROLLBACK TRAN
      ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
      RETURN @error
      

      这样,调用 proc 可以检查存储过程的返回值,并确定它是要提交还是继续冒泡错误。

      原因是“COMMIT”只会减少您的交易计数器。一旦它将事务计数器减为零,就会发生实际的提交。

      【讨论】:

        【解决方案5】:

        是的,所有嵌套的存储过程调用都包含在事务范围内。如果您使用的是 SQL Server 2005 或更高版本,您也可以使用 Try...Catch。 Here 对此有更详细的说明。

        【讨论】:

          【解决方案6】:

          我相信在 MS SQL Server 中,存储过程的执行会发生在事务中,但要非常小心。如果您有嵌套事务(即存储过程外部的事务和存储过程内部的不同事务),回滚将影响所有事务,而不仅仅是最近的封闭事务。

          【讨论】:

            【解决方案7】:

            是的,您在开始事务和提交(或回滚)之间所做的一切都是事务的一部分。

            【讨论】:

            • 这并不完全正确。实际上,对表变量的操作超出了事务范围;回滚不会影响对表变量所做的任何更改。
            • 嗯,我的意思是你对数据库所做的一切 - 我想我认为很明显变量不受事务影响 - 尽管我认为它不太直观表变量比标量变量。
            • 如果外部事务内部调用的Sp调用提交事务怎么办?内部事务提交后,外部事务调用rollback,内部事务会回滚吗?
            • 是的,这就是嵌套事务的工作方式。提交内部事务does nothing;只有外部事务实际上被提交或回滚。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-07
            • 2012-08-28
            • 2011-10-10
            • 2010-09-15
            • 2022-08-07
            • 1970-01-01
            • 2016-06-11
            相关资源
            最近更新 更多