select * from sys.dm_tran_locks
where resource_database_id=db_id()
Run Code Online (Sandbox Code Playgroud)
我正在使用上面的查询来监视锁。
当 SELECT 查询在没有关键字的情况下运行时WITH(NOLOCK)
,我可以看到授予以下锁:S、IS
当我使用关键字时WITH(NOLOCK)
,我可以看到授予以下锁:Sch-S
既然涉及到锁(共享锁),就意味着它不会阻塞其他读取者。此外,由于该关键字允许脏读,因此它意味着它可以读取正在由尚未提交的事务修改的行。
但我的理解是,行/表上的共享锁将阻止该行/表被写入。这个概念是否也适用于 Sch-S 和关键字所采用的任何其他锁(如果有)with(nolock)
?
Tib*_*szi 12
Sch-S 锁不是共享锁。它是一个架构稳定性锁。它禁止有人在执行脏读查询时尝试运行 ALTER TABLE 命令。
当执行架构更改(如 ALTER TABLE)时,SQL Server 会获取架构修改锁 (Sch-M)。它是所有锁中限制性最强的,并且与任何其他类型的锁不兼容。
当您尝试脏读时,SQL Server 会尝试获取架构稳定性锁,该锁只会被架构修改锁阻止。
归档时间: |
|
查看次数: |
988 次 |
最近记录: |