根据这篇文章
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 被释放?
X 锁一直保持到第一个事务结束。
但是,如果页面没有未提交的更改,SQL Server 可以跳过使用 S 锁,因此第二个事务永远不会被第一个事务阻塞。
此处详细介绍了这个确切的场景The Case of the Missing Shared Locks
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |