Sql server 是否会防止在同一次执行中多次更新同一行,以不同的结果结束?
如果一个表有如下行:
1
2
3
并且执行一次更新以将所有“1”更改为“2”并将所有“2”更改为“3”,是否可以将第一行更改为“2”然后再次更改为“3”以所有行结尾“3”值?
在 SQL Server 中进行测试:
create table t ( c1 int );
insert into t (c1) values (1);
insert into t (c1) values (2);
insert into t (c1) values (3);
update t
set c1 =
case
when c1 = 1 then 2
when c1 = 2 then 3
else c1
end
;
select *
from t;
结果表明每个值仅进行一次逻辑更新。
但我正在考虑在这种情况下,所有值都在同一页面中(因为是一个小集合)。但是,如果它们在不同的页面中,并且在更新期间使用一个索引来扫描行,那么在执行开始时更新的值可能会在索引中被推送到不同的页面并再次访问同样的执行。如果发生这种情况,该行可能会更新多次,以不同的结果结束。
我的测试没有显示这种行为,但我找不到这是否是由 SQL Server 强制执行的,或者我的测试是否由一些偶然的执行计划来防止这种情况发生。
可以通过更新到不同的列或使用其他技术来防止这种情况,我只是问我是否可以信任 SQL Server 来防止这种情况。