为什么 SQL 即使事务回滚,服务器仍保持可变状态?

Why does SQL Server keep variable state even if transaction is rolled back?

我写了一个脚本来做一个小实验:

use MyDatabase;
declare @variable int;
set @variable = 5;
begin tran test
    set @variable = 6;
rollback tran test;
select @variable;

如您所见,@variable 在脚本的开头是 declared,初始化为 5,然后在 transaction 中设置为 6。在 transaction 被回滚,我们显示 @variable,它的值仍然是 6,尽管它的值更改在 transaction 中,从那时起被回滚。我本以为选择会产生 5 的结果。这种行为的原因是什么?

因为事务是用来维护真实数据的,tables中的数据(不是变量,不是table变量)。这就是它的全部内容。

这对于您可能想要回滚但 return 事务中的一些单独值作为您回滚原因的指示的场景很有用(可能抛出或只是重新调整变量状态代码)。

考虑变量服从事务语义需要做些什么。您需要将所有更改写入事务日志(可能不是 the 事务日志),在那里它们可以任意前滚和后滚。为了什么?变量本质上是短暂的,因此您不会在数据库或服务器崩溃的情况下恢复它们。所以,这是一个高成本、低回报的操作。不是你想进入的象限。