データベースでは、インデックスはデータベースの一部であるデータ構造であり、データベース システムがユーザー データへのアクセスを効率的にナビゲートするために使用します。インデックス データはユーザー データとは異なるシステム データであり、主にポインタで構成されます。データベースの変更 (挿入、削除、または変更操作による) では、正確なユーザー データ アクセスを維持するためにインデックスを更新する必要がある場合があります。[1] インデックス ロックは、インデックスの整合性を維持するために使用される手法です。関連するユーザー データへのアクセス試行の結果として、トランザクションによってこの部分がアクセスされている場合、データベース トランザクション中にインデックスの一部がロックされます。さらに、システムの自己保守アクティビティの一環として、特別なデータベース システム トランザクション (ユーザーが呼び出したトランザクションではない) が呼び出され、インデックスを維持および変更することがあります。インデックスの一部がトランザクションによってロックされている場合、他のトランザクションはこのインデックス部分へのアクセスをブロックされることがあります (ロックの種類と必要な操作によっては、変更や読み取りさえもブロックされます)。インデックス ロック プロトコルは、ファントム リード現象が発生しないことを保証します。インデックス ロック プロトコルは、次のように規定しています。
- すべてのリレーションには少なくとも 1 つのインデックスが必要です。
- トランザクションは、リレーション上の1つ以上のインデックスを通じてタプルを見つけた後にのみタプルにアクセスできます。
- ルックアップを実行するトランザクション Ti は、リーフ ノードにインデックス ルックアップを満たすタプルが含まれていない場合でも (たとえば、範囲クエリの場合、リーフ内のタプルは範囲内にありません)、S モードでアクセスするすべてのインデックス リーフ ノードをロックする必要があります。
- リレーションr内のタプルtiを挿入、更新、または削除するトランザクションTiは、 rへのすべてのインデックスを更新し、挿入/更新/削除の影響を受けるすべてのインデックスリーフノードに対して排他ロックを取得する必要があります。
- 2 フェーズ ロックプロトコルのルールを遵守する必要があります。
[1]
インデックスへのアクセスには、特殊な同時実行制御技術が存在します。これらの技術はインデックスの種類に依存し、その構造を利用します。通常、ユーザーデータに適用される一般的な同時実行制御方法をインデックスに適用するよりもはるかに効果的です。注目され、広く研究されているのは、データベースインデックスとして定期的に使用されるBツリー用の特殊な技術(Bツリー同時実行制御[2])です。
インデックスロックは、インデックスに同時にアクセスするスレッドを調整するために使用され、通常、ユーザーデータに対する一般的なトランザクションロックよりも短命です。専門文献では、ラッチと呼ばれることがよくあります。[2]
参照
- データベースインデックス
- 同時実行制御
- ロック(データベース)
- Bツリー同時実行制御
参考文献
- ^ ab Gerhard Weikum、Gottfried Vossen (2001): トランザクション情報システム第 9 章、エルゼビア、ISBN 1-55860-508-8
- ^ ab Goetz Graefe (2010):「B ツリー ロック テクニックの調査」ACM Transactions on Database Systems (TODS)、第 35 巻第 3 号、2010 年 7 月 (また HPL-2010-9 Archived 2012-03-16 at the Wayback Machine、HP Laboratories)。
