让我们假设以下情况。
有一个students
表:
编号 | 姓名 ----------------- 1 | 马特乌斯
“用户 A”在不提交事务的情况下执行以下语句:
update students set name = 'Gustavo' where id = 1
然后“用户 B”执行以下查询:
select * from students with (nolock) where id = 1
用户 B 将获得 name Gustavo
,这是预期的行为。DB会因为with(nolock)
指令返回未提交的值。
Mateus
即使有未提交的事务,有没有办法获取旧名称(先前提交的值)?
您可以在数据库上使用 Read Committed Snapshot Isolation (RCSI),它使用 TempDB 中的空间来跟踪数据的已提交版本。
请注意,RCSI 为每个版本化的行添加 14 个字节,因此您可能会在数据库中看到一些额外的页面拆分。它还要求监视 TempDB 的空间和 I/O,以确保它不会减慢速度。
阅读更多由Paul White和在这个问题中。