Sql-Server
在 IsolationLevel.ReadUncommitted 上發出共享鎖
我讀到如果我使用 IsolationLevel.ReadUncommitted,查詢不應該發出任何鎖。但是,當我對此進行測試時,我看到了以下鎖:
Resource_Type:HOBT
Request_Mode:S(共享)
什麼是 HOBT 鎖?與 HBT(堆或二叉樹鎖)有關的東西?
為什麼我仍然會獲得 S 鎖?
在不開啟隔離級別快照選項的情況下查詢時如何避免共享鎖定?
我正在 SQLServer 2008 上對此進行測試,並且快照選項設置為關閉。該查詢僅執行選擇。
我可以看到 Sch-S 是必需的,儘管 SQL Server 似乎沒有在我的鎖定查詢中顯示它。為什麼它仍然發出共享鎖?根據:
在該級別執行的事務
READ UNCOMMITTED
不會發出共享鎖,以防止其他事務修改目前事務讀取的數據。所以我有點困惑。
HOBT鎖是什麼?
為什麼我仍然會獲得 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 鎖的原因是為了防止讀取未格式化的頁面。