相关疑难解决方法(0)

在 IsolationLevel.ReadUncommitted 上发出共享锁

我读到,如果我使用 IsolationLevel.ReadUncommitted,则查询不应发出任何锁。但是,当我对此进行测试时,我看到了以下锁定:

Resource_Type:HOBT
Request_Mode:S(共享)

什么是 HOBT 锁?与 HBT(堆或二叉树锁)相关的东西?

为什么我还会得到 S 锁?

在不打开隔离级别快照选项的情况下进行查询时如何避免共享锁定?

我正在 SQLServer 2008 上对此进行测试,并且快照选项设置为关闭。查询仅执行选择。

我可以看到 Sch-S 是必需的,尽管 SQL Server 似乎没有在我的锁定查询中显示它。为什么它仍然发出共享锁?根据:

设置事务隔离级别 (Transact-SQL)

在该READ UNCOMMITTED级别运行的事务不会发出共享锁,以防止其他事务修改当前事务读取的数据。

所以我有点困惑。

sql-server-2008 sql-server locking isolation-level

10
推荐指数
2
解决办法
2911
查看次数

为什么WITH(NOLOCK)采用共享锁并且此类锁不会阻止写入?

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)

sql-server

3
推荐指数
1
解决办法
988
查看次数