为什么即使事务被回滚,SQL Server也会保持变量状态?

时间:2016-10-08 11:37:40

标签: sql-server transactions rollback

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

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

如您所见,@variable在脚本开头是declare d,用5初始化,然后在transaction内,它被设置为6. {{1}之后回滚后,我们显示transaction,它仍然具有值6,尽管它的值更改在@variable内,从那时起被回滚。我本来期望选择结果为5.这种行为的原因是什么?

2 个答案:

答案 0 :(得分:5)

因为事务用于维护真实数据,表中的数据(不是变量,而不是表变量)。这就是关于它的一切。

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

答案 1 :(得分:2)

考虑变量遵循事务语义需要什么。您需要将所有更改写入事务日志(可能不是 事务日志),以便可以向前和向后滚动它们。为了什么?变量本质上是短暂的,因此在数据库或服务器崩溃的情况下,您无法恢复它们。因此,它是一种高成本,低回报的操作。不是你想要的象限。