複数粒度ロック
複数粒度ロック(Multiple Granularity Locking、MGL)は、データベース管理システム(DBMS)やリレーショナルデータベースで使われるロック手法である。John Rayner Locking Methodとも呼ばれる。
MGLでは、ロックは他のオブジェクトを含んだオブジェクトに対して設定される。MGLは「包含関係」の階層構造の性質を利用する。例えば、データベースにはファイルがあり、ファイルにはページがあり、ページにはレコードがある。これをオブジェクトの木構造と捉え、各ノードに子ノードが包含されているとする。ロックは対応するノードとその配下のノード群をまとめてロックする。
複数粒度ロックでは、直列化可能性(Serializability)を保証するため、厳密でない (Non-strict) ツーフェーズロックを使用することが多い。MGLでは上位ノードでの粒度のロックが必要になったときにロックエスカレーションと呼ばれる機能を使用する。そうでなくとも、DBMSではロックを確保する際にメモリを使用する場合があり、多数のロックを獲得するとそれだけメモリを消費することになる。そのようなときにシステムが自動的にロックエスカレーションによって上位の粒度のロックに切り替えてメモリ消費を抑える場合がある。
ロックモード
[編集]厳密な (Strict) ツーフェーズロックなどの他のロック手法にもある共有 (Shared) と排他 (eXclusive) だけでなく、MGLでは Intention Shared と Intention eXclusive というロックも使用する。ISロックは Xロックと衝突し、IXロックは Sロック/Xロックと衝突する。
あるノードをS(またはX)でロックするためには、MGLはその上位ノード全体をIS(またはIX)でロックしてから、対象ノードをS(またはX)でロックする。従って、他のトランザクションはその上位ノードをX(またはSとX)でロックすることができない。
MGLのロックモードの比較表を以下に示す。左端のモードでロックされているノードに上端のモードでロックしようとした場合にロックできるかどうかを示している。
IS | IX | S | SIX | X | |
---|---|---|---|---|---|
IS | Yes | Yes | Yes | Yes | No |
IX | Yes | Yes | No | No | No |
S | Yes | No | Yes | No | No |
SIX | Yes | No | No | No | No |
X | No | No | No | No | No |