SQL Server 在 xlock 存在时抓取共享锁

Alb*_*rtK 1 t-sql sql-server

根据这篇文章

Shared (S) - 用于不更改或更新数据的操作(只读操作),例如 SELECT 语句。

根据这篇文章

当排他 (X) 锁被持有时,在排他 (X) 锁被释放之前,任何其他事务都不能在该资源上获取任何类型的锁(共享、更新或排他)。

因此,在第一个会话中,我运行以下代码:

begin tran

select * 
from SomeTable with (xlock)

waitFor delay '00:00:05'

commit tran
Run Code Online (Sandbox Code Playgroud)

当第一个事务运行时,我在第二个会话中运行以下代码:

begin tran

select * from SomeTable

commit tran
Run Code Online (Sandbox Code Playgroud)

我立即看到 select 语句的结果。

为什么第二个事务不等待 xlock 被释放?

Mar*_*ith 5

X 锁一直保持到第一个事务结束。

但是,如果页面没有未提交的更改,SQL Server 可以跳过使用 S 锁,因此第二个事务永远不会被第一个事务阻塞。

此处详细介绍了这个确切的场景The Case of the Missing Shared Locks