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