Sql-Server

在 IsolationLevel.ReadUncommitted 上發出共享鎖

  • November 20, 2021

我讀到如果我使用 IsolationLevel.ReadUncommitted,查詢不應該發出任何鎖。但是,當我對此進行測試時,我看到了以下鎖:

Resource_Type:HOBT

Request_Mode:S(共享)

什麼是 HOBT 鎖?與 HBT(堆或二叉樹鎖)有關的東西?

為什麼我仍然會獲得 S 鎖?

在不開啟隔離級別快照選項的情況下查詢時如何避免共享鎖定?

我正在 SQLServer 2008 上對此進行測試,並且快照選項設置為關閉。該查詢僅執行選擇。

我可以看到 Sch-S 是必需的,儘管 SQL Server 似乎沒有在我的鎖定查詢中顯示它。為什麼它仍然發出共享鎖?根據:

設置事務隔離級別 (Transact-SQL)

在該級別執行的事務READ UNCOMMITTED不會發出共享鎖,以防止其他事務修改目前事務讀取的數據。

所以我有點困惑。

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 鎖的原因是為了防止讀取未格式化的頁面。

引用自:https://dba.stackexchange.com/questions/8627