【にそうロック】

二相ロック(2PL) とは?

最終更新:
💡 ロックを取り終えてから、手放す段階へ

トランザクションのロック取得と解放を2つの段階に分ける方式。一度ロックを解放したら新しいロックを取らず、競合するアクセスを適切に保護することで競合直列化可能性を得る。

📌 このページのポイント
二相ロック:取ってから、手放す取得する段階解放する段階保持数最後の取得=ロックポイント時間 →一度手放したら、新しく取らない
1つのトランザクションが保持するロック数の仮の例。Strict 2PLでは、少なくとも排他ロックをコミットかアボートまで保持します。
ひよこ ひよこ
二相ロックって、ロックが2種類あるの?
ペンギン先生 ペンギン先生
2つなのは時間の段階だよ。成長フェーズで必要なロックを取り、縮小フェーズで手放す。一度でも手放したら、そのトランザクションでは新しいロックを取らないんだ。
ひよこ ひよこ
それで並行処理も安全になる?
ペンギン先生 ペンギン先生
読み取りと書き込みに適したロックで、競合する全アクセスを保護することが前提だよ。全トランザクションが二相の規則を守ると、ある順序で1つずつ実行したのと同等にできる。これを競合直列化可能というんだ。
ひよこ ひよこ
ロックポイントはどこ?
ペンギン先生 ペンギン先生
最後のロックを取得した時点だよ。その後はロックを保持し、やがて解放を始める。ロックを全部持っている時間がある場合、最後の取得と最初の解放は同じ瞬間とは限らないんだ。
ひよこ ひよこ
Strict 2PLは何を厳しくするの?
ペンギン先生 ペンギン先生
少なくとも排他ロックをコミットかアボートまで保持するよ。未確定の書き込みを他のトランザクションが読み書きする問題や、アボートの連鎖を防ぐ。共有ロックも終了まで持つ定義・実装もあるので、資料の定義を確認しよう。
ひよこ ひよこ
二相ならデッドロックも防げる?
ペンギン先生 ペンギン先生
基本の2PLでも、互いに相手のロックを待つデッドロックは起こり得るよ。検出して一方を中断するなどの仕組みが必要。名前が似た二相コミットは、複数の参加者でコミットか中止かを決める別の手順だよ。
もっと詳しく知りたい人へ

存在する行を二相でロックすれば、範囲検索も安全ですか?

それだけでは足りません。検索条件に合う新しい行の挿入を防げない場合があるため、述語ロック・範囲ロックなどで条件に関わる競合も保護する必要があります。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「二相ロック」って出てきたら「ロックを取る段階と手放す段階を分けるルール」と思えばだいたいOK!
📖 おまけ:英語の意味
「Two-Phase Locking」 = 二相ロック
💬 ロックを取る成長(growing)と、手放す縮小(shrinking)の2つの相(フェーズ)に分けて使うから、この名前だよ

参考資料

← 用語集にもどる