2相ロッキングプロトコルとは?にそうロッキングプロトコル
2相ロッキングプロトコルとは、トランザクションが扱うロックを、獲得だけを行う成長相と解放だけを行う縮退相に分け、いったん解放を始めたら新たなロックを取らないという規約。参加するトランザクションがすべてこれを守れば、同時に走らせた結果が何らかの順番で1本ずつ流した結果と一致すること(直列化可能性)が保証される。
最終更新:2026-10-06
この語が出る過去問を解く →背景
同時実行を許すと処理量は伸びるが、同じ行を二つの処理が前後して触ることで、片方の更新が消えるといった不整合が生じる。実行の順序をそのつど検証するのは現実的でないため、各トランザクションが単独で守れる規約の形にして、規約さえ守れば結果の正しさが導かれるように組み立てられた。
具体例
夜間バッチと日中のオンライン処理が同じ在庫テーブルへ触る構成では、必要な行ロックを処理の前半で取り切り、コミットまで解放しない作りにする。Oracle DatabaseやPostgreSQLの既定の分離レベルは多版同時実行制御で動くが、SELECT ... FOR UPDATE で明示的にロックを取る箇所は、この規約の考え方で設計する。
試験での引っ掛け
直列化可能性は保証するが、デッドロックは防げない——互いに相手のロックを待つ状態は規約を守っていても起き得るので、検出とタイムアウトは別に用意する。解放をコミット時まで遅らせる方式は厳格2相ロックと呼び、他のトランザクションが未コミットの値を読まないためカスケードアボートを防げる。両者を同じものとして扱う記述に注意する。
関連用語
出た過去問
出典:令和5年度 春期 ITサービスマネージャ試験 午前Ⅱ 問23(IPA)
2相ロッキングプロトコルに従うトランザクションで発生する可能性のある現象はどれか。
正解:デッドロック
要点:2相ロックは直列化可能性を保証するが、デッドロックは防げない
2相ロッキングプロトコルは、ロックを取得する成長相と解放する縮退相に分け、いったん解放を始めたら新たなロックを取らない方式である。これにより直列化可能性(順番に実行したのと同じ結果になる性質)が保証され、ロストアップデートやノンリピータブルリードといった不整合は防げる。さらにロックをコミットまで保持する形(厳格な2相ロッキング)にすれば、ダーティリードも防げる。しかし複数トランザクションが互いの保持するロックを待ち合う状態は避けられず、デッドロックは発生し得る。
出典・参考
解説は資格暗記が独自に作成しています。過去問の出典は各問題に記載のとおりです。