我读到,如果我使用 IsolationLevel.ReadUncommitted,则查询不应发出任何锁。但是,当我对此进行测试时,我看到了以下锁定:
Resource_Type:HOBT
Request_Mode:S(共享)
什么是 HOBT 锁?与 HBT(堆或二叉树锁)相关的东西?
为什么我还会得到 S 锁?
在不打开隔离级别快照选项的情况下进行查询时如何避免共享锁定?
我正在 SQLServer 2008 上对此进行测试,并且快照选项设置为关闭。查询仅执行选择。
我可以看到 Sch-S 是必需的,尽管 SQL Server 似乎没有在我的锁定查询中显示它。为什么它仍然发出共享锁?根据:
在该
READ UNCOMMITTED
级别运行的事务不会发出共享锁,以防止其他事务修改当前事务读取的数据。
所以我有点困惑。
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)
?