IsolationLevel.ReadUncommittedで発行された共有ロック


10

IsolationLevel.ReadUncommittedを使用すると、クエリでロックが発行されないはずです。しかし、これをテストすると、次のロックが表示されました。

Resource_Type:HOBT
Request_Mode:S(共有)

HOBTロックとは何ですか?HBT(ヒープまたはバイナリツリーロック)に関連する何か?

なぜまだSロックを取得するのですか?

分離レベルのスナップショットオプションをオンにせずにクエリを実行するときに、共有ロックを回避するにはどうすればよいですか?

SQLServer 2008でこれをテストしていますが、スナップショットオプションはオフに設定されています。クエリは選択のみを実行します。

SQL Serverがロッククエリでそれを表示していないようですが、Sch-Sが必要であることがわかります。それでも共有ロックが発行されるのはなぜですか?による:

トランザクション分離レベルの設定(Transact-SQL)

READ UNCOMMITTEDレベルで実行中のトランザクションは、他のトランザクションが現在のトランザクションによって読み取られたデータを変更するのを防ぐために、共有ロックを発行しません。

だから私は少し混乱しています。

回答:


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操作は、テーブルで実行できません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.