インデックスロック

インデックスロック (英: index locking)は、インデックスの整合性を維持するために使用される手法である。

概要 
データベースでは、インデックスはデータベースの一部であるデータ構造であり、データベース管理システムがユーザーデータへのアクセスを効率的に行えるようにする。インデックスデータは、ユーザーデータとは異なるシステムデータであり、主にポインタで構成される。データベースの変更（挿入、削除、修正操作）では、ユーザーデータへの正確なアクセスを維持するため、必要に応じてインデックスを更新する。 

インデックスロックはこの時に発動され、インデックスデータのうち更新が必要な該当する部分は、データベーストランザクション中に一時的にロックされる。さらに、システムの自己保守アクティビティのための特別なデータベースシステムトランザクション（ユーザーが呼び出すトランザクションではない）が発生することがある。

インデックスの一部がトランザクションによってロックされると、他のトランザクションがこのインデックス部分にアクセスできないようにブロックされることがある。ロックの種類と必要な操作によっては、変更や読み取りもブロックされることになる。インデックスロックプロトコルは、ファントム・リード現象 (Phantom Read) が発生しないことを保証する。

インデックスロックプロトコルの決まり事：

 すべてのリレーションには、少なくとも1つのインデックスが必要。
 トランザクションは、リレーションの1つ以上のインデックスを介してタプルを見つけた後でのみ、タプルにアクセスできる。
 ルックアップを実行するトランザクションTiは、Sモードで、アクセスするすべてのインデックスの木構造をロックする必要がある。木構造にインデックスルックアップを満たすタプルが含まれていない場合（たとえば、範囲クエリの場合、この範囲内の木構造にタプルがない場合）であってもロックが必要である。
 リレーションrのタプルtiを挿入、更新、または削除するトランザクションTiは、すべてのインデックスをrに更新する必要があり、挿入/更新/削除の影響を受けるすべてのインデックス木構造で排他ロックを行う必要がある。
 2フェーズロックプロトコルのルールを遵守する必要がある。

インデックスにアクセスするための特殊な並行性制御技術も存在する。これらの手法はインデックスの種類に依存しており、その構造を利用する。これらは通常、ユーザーデータに適用される一般的な同時実行制御方法をインデックスに適用するよりもはるかに効果的である。とても注目されており、広く研究されているB木の特殊な手法として"B木の並行性実行制御" というものがあり、データベースのインデックスとしてよく使用される。

インデックスロックは、インデックスに同時にアクセスするスレッドを調整するために使用され、通常、ユーザーデータに対する一般的なトランザクションロックよりも有効期間が短くなる。専門家の文献では、それらはしばしば "ラッチ" と呼ばれる。

関連項目 

 データベースインデックス
 並行性制御
 レコードロック

脚注 

並行性制御
トランザクション処理
データベース