ロックの粒度と階層

Microsoft SQL Server データベース エンジンでは、複数粒度のロックがサポートされており、種類の異なるリソースをトランザクションでロックできます。データベース エンジンにより、タスクに適したレベルでリソースが自動的にロックされるので、最小限のコストでロックされます。ロックの粒度を細かくすると (行単位など)、同時実行性が高くなります。ただし、多くの行をロックすると、ロック数が増えるのでオーバーヘッドが増大します。ロックの粒度を粗くすると (テーブル単位など)、テーブル全体がロックされるので、他のトランザクションがそのテーブルにアクセスできなくなります。このため、同時実行性が低下します。ただし、ロック数が減るので、オーバーヘッドは減少します。

適用対象: SQL Server 2008 R2 以上のバージョン。

データベース エンジンではリソースを完全に保護するために、多くの場合、レベルの異なる粒度でロックを取得する必要が生じます。この複数レベルの粒度でのロックのグループを、ロック階層と呼びます。たとえば、データベース エンジンのインスタンスは、インデックスの読み取りを完全に保護するために、行の共有ロックと、ページやテーブルのインテント共有ロックを取得しなければならない場合があります。

次の表に、データベース エンジンがロックできるリソースを示します。

リソース

説明

RID

ヒープ内の 1 行をロックするのに使用される行識別子。

KEY

シリアル化可能なトランザクションのキー範囲の保護に使用されるインデックス内の行ロック。

PAGE

データ ページやインデックス ページなど、データベース内の 8 KB のページ。

EXTENT

データ ページやインデックス ページなど、連続した 8 ページのグループ。

HoBT

ヒープまたは B ツリー。B ツリー (インデックス)、またはクラスター化インデックスのないテーブルのヒープ データ ページを保護するロックです。

TABLE

すべてのデータとインデックスを含むテーブル全体。

FILE

データベース ファイル。

APPLICATION

アプリケーションにより指定されたリソース。

METADATA

メタデータのロック。

ALLOCATION_UNIT

アロケーション ユニット。

DATABASE

データベース全体。

注意

HoBT ロックおよび TABLE ロックは、ALTER TABLE の LOCK_ESCALATION オプションの影響を受ける可能性があります。