web-dev-qa-db-ja.com

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

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

Resource_Type:HOBT
Request_Mode:S(共有)

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

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

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

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

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

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

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

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

10
dsum

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ロックを取得する理由は、フォーマットされていないページの読み取りを防ぐためです。

13
Martin Smith

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

5
Remus Rusanu