【问题标题】:Nested transactions in Sql ServerSql Server 中的嵌套事务
【发布时间】:2009-02-09 11:54:36
【问题描述】:

想象以下场景:

我正在使用 SQL Server 2005。我有一个事务正在调用除其他 SQL 语句之外的一个存储过程,该存储过程内部也有一个事务。外层事务有时会失败,在存储过程调用提交成功后会回滚。

我的问题是,存储过程的事务也会回滚吗?

【问题讨论】:

    标签: sql-server transactions


    【解决方案1】:

    对于嵌套事务,提交不会将任何更改写入磁盘,顶级事务除外。回滚,但是无论事务的级别如何,它都会起作用,所以是的,它会回滚内部事务。

    【讨论】:

    【解决方案2】:

    绝对是的,顶级事务将拥有所有数据更改,直到它被提交或回滚。

    不过,我建议您仔细考虑事务模型。您的系统中存在的此类场景越多,您面临的锁定问题就越大。该过程的计算开销也增加了。

    令人惊讶的是,在合理化 SQL 时,我发现事务已经在不需要的地方实现了。我鼓励您(以及任何处理交易的人)仔细考虑为什么您在每种情况下都使用它们,以及如果交易未实施会发生什么。只值我的 2 美分!

    【讨论】:

      【解决方案3】:

      是的,存储过程将被回滚。

      这是您的代码的整体流程:

      BEGIN TRY
      
          BEGIN TRANSACTION
      
          EXEC SotredProcedureName
      
          --Do some other activity
      
          COMMIT TRANSACTION
      END TRY
      BEGIN CATCH
      
          --IF an error occurs then rollback the current transaction, which includes the stored procedure code.
          ROLLBACK TRANSACTION
      
      END CATCH
      

      干杯,约翰

      【讨论】:

        【解决方案4】:

        我已经尝试使用 begin tran 并在存储过程中提交,比如 usp_test。
        执行这些 sp 与下面的一些其他查询

        update x set name='xxx'
        select * from x---contains 'xxx'
        begin tran
        update x set name='yyy'
        select * from x---contains 'yyy'
        exec usp_test
        select * from x---contains 'zzz' inside the sp
        rollback tran
        

        在 x 表中执行上述查询时,名称必须是“xxx”而不是“zzz”,因为第一次 begin tran 甚至 sp tran 提交都会回滚。
        所以,首先开始传输自己的数据变化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多