Read Committed Snapshop 隔离级别 - NOLOCK 的影响

Ran*_*der 1 sql-server locking isolation-level snapshot-isolation

据我了解,使用 Read Committed Snapshot,读者不会阻止作者,而作者不会阻止读者。唯一可能发生的阻塞是编写器阻塞编写器。默认情况下,我们的数据库设置为 Read Committed Snapshot。但是,我们有很多用户使用 WITH (NOLOCK) 发出查询(出于不良习惯)。如果我理解正确,使用 WITH (NOLOCK) 的查询会更改隔离级别。当在查询中使用它时,读取器现在是否可以阻止尝试更新正在读取的数据的进程?

sep*_*pic 5

如果我理解正确,使用 WITH (NOLOCK) 的查询会更改隔离级别。当在查询中使用它时,读取器现在是否可以阻止尝试更新正在读取的数据的进程?

不,你想错了。inRCSIRead Uncommittedreader 都不会阻止作者。

机制不同:RCSI为读取器使用最后提交的修改数据副本,SELECT使用with (nolock)将访问“脏”数据,但在这两种情况下都没有阻塞。

这是一个例子。你进行这样的更新:

begin tran
   update dbo.t
   set col1 = 20 where col1 = 10;
-- transaction is still open, X lock is held on a row
Run Code Online (Sandbox Code Playgroud)

在第二个会话中,您使 SELECT * from dbo.t;

RCSI你会回来col1 = 10的情况下,Read Uncommitted如果你会得到col1 = 20,但会话 2 将立即返回这两种情况下的数据,而无需等待第一个会话的事务提交/回滚