ロックの粒度と階層
MicrosoftSQL Server データベース エンジンでは、複数粒度のロックがサポートされており、種類の異なるリソースをトランザクションでロックできます。データベース エンジンにより、タスクに適したレベルでリソースが自動的にロックされるので、最小限のコストでロックされます。ロックの粒度を細かくすると (行単位など)、同時実行性が高くなります。ただし、多くの行をロックすると、ロック数が増えるのでオーバーヘッドが増大します。ロックの粒度を粗くすると (テーブル単位など)、テーブル全体がロックされるので、他のトランザクションがそのテーブルにアクセスできなくなります。このため、同時実行性が低下します。ただし、ロック数が減るので、オーバーヘッドは減少します。
データベース エンジンではリソースを完全に保護するために、多くの場合、レベルの異なる粒度でロックを取得する必要が生じます。この複数レベルの粒度でのロックのグループを、ロック階層と呼びます。たとえば、データベース エンジンのインスタンスは、インデックスの読み取りを完全に保護するために、行の共有ロックと、ページやテーブルのインテント共有ロックを取得しなければならない場合があります。
次の表に、データベース エンジンがロックできるリソースを示します。
リソース |
説明 |
---|---|
RID |
ヒープ内の 1 行をロックするのに使用される行識別子。 |
KEY |
シリアル化可能なトランザクションのキー範囲の保護に使用されるインデックス内の行ロック。 |
PAGE |
データ ページやインデックス ページなど、データベース内の 8 KB のページ。 |
EXTENT |
データ ページやインデックス ページなど、連続した 8 ページのグループ。 |
HoBT |
ヒープまたは B ツリー。B ツリー (インデックス)、またはクラスタ化インデックスのないテーブルのヒープ データ ページを保護するロックです。 |
TABLE |
すべてのデータとインデックスを含むテーブル全体。 |
FILE |
データベース ファイル。 |
APPLICATION |
アプリケーションにより指定されたリソース。 |
METADATA |
メタデータのロック。 |
ALLOCATION_UNIT |
アロケーション ユニット。 |
DATABASE |
データベース全体。 |
注意 |
---|
HoBT ロックおよび TABLE ロックは、ALTER TABLE の LOCK_ESCALATION オプションの影響を受ける可能性があります。 |