部分回滚不会减少 trancount

Pet*_*ter 2 sql-server transaction rollback

假设我有一个打开的 SQL Server 会话,并执行以下操作:

begin tran 

insert into People (Id) values (1)

select @@TRANCOUNT -- Prints 1

save transaction tt

begin tran

select @@TRANCOUNT -- Prints 2

insert into People (Id) values (2)
Run Code Online (Sandbox Code Playgroud)

好的,现在我做了一个:

rollback tran tt

select @@TRANCOUNT -- Prints 2!
Run Code Online (Sandbox Code Playgroud)

我的问题可能很明显:

为什么部分回滚不会减少内部事务增加的@@TRANCOUNT?

要提交更改,我应该执行两个提交命令。恕我直言,似乎并不自然。

Mar*_*ith 6

@@TRANCOUNT报告BEGIN TRANSACTION语句计数,而不是活动事务。从不同的角度来看,它是在报告嵌套事务的深度。

@@TRANCOUNT (Transact-SQL) 返回在当前连接上发生的 BEGIN TRANSACTION 语句的数量。[来源]

对嵌套事务和保存点使用的误解是因为嵌套事务不是我们期望的那样。就所有意图和目的而言,没有嵌套事务之类的东西。一组嵌套事务的操作不会提交,直到您发出最外层的操作COMMIT并且 aROLLBACK将撤消所有操作。

嵌套事务的存在是为了支持过程中的事务,这些过程可以从可能已经启动父事务的外部进程、可能已经完成相同事务的父过程或不存在先前事务的情况下调用。它们不提供嵌套的提交和回滚行为。

  • +1 表示“没有嵌套事务之类的东西”。 (4认同)