为什么 SELECT 可以在提交之前看到更新的行?

Ian*_*ton 6 sql-server transaction

如果我在没有提交声明的情况下运行它......

begin transaction

update dateranges set DateRangeTypeId = 1 where DateRangeId = 154
Run Code Online (Sandbox Code Playgroud)

在 Management Studio 的另一个选项卡中,我可以选择 Id 为 154 的范围,它会显示类型列的旧值。

为什么 SELECT 不会在更新的行上阻塞?

Dan*_*man 12

假设第二个 SSMS 窗口使用默认READ_COMMITTED隔离级别,如果数据库READ_COMMITTED_SNAPSHOT打开了设置,您将看到 before 值,而不是被未提交的事务阻止。

SELECT name, snapshot_isolation_state_desc
FROM sys.databases
ORDER BY name;
Run Code Online (Sandbox Code Playgroud)

READ_COMMITTED_SNAPSHOT数据库设置使用行版本,而不是锁定为读一致性,所以作家不会阻止读者和反之亦然。