代码之家  ›  专栏  ›  技术社区  ›  David Espart

Sql Server中的嵌套事务

  •  31
  • David Espart  · 技术社区  · 16 年前

    想象一下以下场景:

    我正在使用SQLServer2005。我有一个事务,在其他SQL语句中调用一个存储过程,该存储过程内部也有一个事务。外部事务有时会失败,并在成功调用和提交存储过程后回滚。

    5 回复  |  直到 12 年前
        1
  •  44
  •   Matthew Farwell    16 年前

    对于嵌套事务,提交不会将任何更改写入磁盘,顶层事务除外。然而,无论事务的级别如何,回滚都是有效的,因此是的,它将回滚内部事务。

        2
  •  12
  •   Timbo    16 年前

    但是,我鼓励您仔细考虑事务模型。系统中存在的此类场景越多,您就越容易遇到锁定问题。此外,该过程的计算费用也增加了。

    值得注意的是,在对SQL进行合理化时,我发现在不需要事务的地方实现了事务。我鼓励您(以及处理事务的任何人)仔细思考为什么要在每个上下文中使用它们,以及如果事务没有实现会发生什么。只是我的价值!

        3
  •  2
  •   John Sansom    16 年前

    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
  •  1
  •   LPL user462990    13 年前

    我在存储过程内尝试了begin tran和commit,比如usp_测试。
    使用其他一些查询执行这些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 commit。
    因此,首先开始传输自己的数据更改。