一次回滚会影响所有事务吗?

Mar*_*lli 6 sql-server transaction sql-server-2014

当我运行以下脚本时:

begin transaction
    select XACT_STATE()

    select @@TRANCOUNT 

    begin transaction


    select XACT_STATE()

    select @@TRANCOUNT 

    begin transaction


    select XACT_STATE()

    select @@TRANCOUNT 

    rollback

    select XACT_STATE()

    select @@TRANCOUNT 
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

在此处输入图片说明

那么一个单一的回滚语句可以回滚任意数量的事务?

那么写以下内容是没有意义的:

while @@TRANCOUNT > 0
      rollback
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 12

是的,提交和回滚在这方面表现不同。

提交只是减少@@trancount. 在达到零之前,没有实际提交任何内容。

回滚将始终回滚事务并设置@@trancount为零。

需要说明的是,无论@@trancount. SQL Server 中的嵌套事务是一个神话。请参阅 Paul Randal 的博客文章:

每天一个 SQL Server DBA 神话:(26/30) 嵌套事务是真实的。