在IsolationLevel.ReadUncommitted上发布的共享锁


10

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

资源类型:HOBT
请求模式:S(共享)

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

为什么我还会得到S锁?

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

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

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

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

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

所以我有点困惑。

Answers:


13

什么是HOBT锁?

一个锁,用于保护没有聚簇索引的表中的B树(索引)或堆数据页。

为什么我还会得到S锁?

这发生在堆上。例

SET NOCOUNT ON;

DECLARE @Query nvarchar(max) = 
   N'DECLARE @C INT; 
     SELECT @C = COUNT(*) FROM master.dbo.MSreplication_options';

/*Run once so compilation out of the way*/
EXEC(@Query);

DBCC TRACEON(-1,3604,1200) WITH NO_INFOMSGS;

PRINT 'READ UNCOMMITTED';
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
EXEC(@Query);

PRINT 'READ COMMITTED';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
EXEC(@Query);

DBCC TRACEOFF(-1,3604,1200) WITH NO_INFOMSGS;

输出量 READ UNCOMMITTED

Process 56 acquiring Sch-S lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring S lock on HOBT: 1:72057594038910976 [BULK_OPERATION] (class bit0 ref1) result: OK

Process 56 releasing lock on OBJECT: 1:1163151189:0 

输出量 READ COMMITTED

Process 56 acquiring IS lock on OBJECT: 1:1163151189:0  (class bit0 ref1) result: OK

Process 56 acquiring IS lock on PAGE: 1:1:169 (class bit0 ref1) result: OK

Process 56 releasing lock on PAGE: 1:1:169

Process 56 releasing lock on OBJECT: 1:1163151189:0 

根据引用Paul Randal的文章,采用此BULK_OPERATION共享HOBT锁的原因是为了防止读取未格式化的页面。


5

ReadUncommitted隔离级别确实会获取锁。架构稳定性锁可防止在执行查询时更改被查询的对象。在所有隔离级别(包括快照和read_committed_snapshot(RCSI))下都将获取此锁。从锁定模式

架构锁

数据库引擎在表数据定义语言(DDL)操作(例如添加列或删除表)期间使用架构修改(Sch-M)锁。在其保留期间,Sch-M锁阻止并发访问表。这意味着Sch-M锁会阻止所有外部操作,直到释放该锁为止。

某些数据操作语言(DML)操作(例如表截断)使用Sch-M锁来防止并发操作访问受影响的表。

在编译和执行查询时,数据库引擎使用架构稳定性(Sch-S)锁。Sch-S锁不会阻止任何事务锁,包括互斥(X)锁。因此,在编译查询时,其他事务(包括在表上具有X锁的事务)将继续运行。但是,并发DDL操作和获取Sch-M锁的并发DML操作无法在表上执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.