情報処理試験を勉強していると、「2相ロッキングプロトコルって排他制御とどう違うの?」「成長相・縮退相って何?」と混乱しがちです。
この記事では、2相ロッキングプロトコルの仕組みを日常の例え話と図解で整理し、試験で得点できる状態まで一気に引き上げます。
対象試験と出題頻度
2相ロッキングプロトコルは、応用情報技術者で出題されるテーマです。
排他制御の発展的なトピックとして、同時実行制御の選択肢問題で登場します。
詳細をクリックして確認
応用情報技術者
★★☆☆☆
ランクC(応用)余裕があれば覚える
用語の定義
2相ロッキングプロトコル(Two-Phase Locking Protocol / 2PL)とは、一言で言うと
「トランザクション中のロック操作を「獲得だけのフェーズ(成長相)」と「解放だけのフェーズ(縮退相)」の2段階に分け、一度でもロックを解放したら新たなロック獲得を禁止するルール」
のことです。
イメージとしては、「ビュッフェの料理取り分け」です。
「まず欲しい料理を全部お皿に盛り付ける(=ロック獲得)。
食べ始めてから『やっぱりあれも追加しよう』と取りに行くのは禁止。食べ終わったらお皿を片付ける(=ロック解放)」
取る時間と返す時間を完全に分離することで、他の人との取り合い(=データ不整合)を防ぎます。
2相ロッキングプロトコルの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Two-Phase Locking Protocol(2PL) |
| 分類 | トランザクションの同時実行制御(排他制御の一手法) |
| 2つのフェーズ | 成長相(Growing Phase):ロック獲得のみ 縮退相(Shrinking Phase):ロック解放のみ |
| 保証するもの | 直列化可能性(Serializability) |
| 防げないもの | デッドロック |
解説
複数のトランザクションを並行実行する場合、ロックの獲得と解放を自由な順序で行うと、途中で別のトランザクションにデータを書き換えられ、結果が矛盾する危険があります。
この問題を解決するために、「ロック操作の順序を2段階に制限する」というルールが考案されました。
それが2相ロッキングプロトコルです。
成長相と縮退相の動き
2つのフェーズの役割を整理します。
第1相(成長相 / Growing Phase):トランザクションが処理に必要なデータに対して、共有ロックまたは専有ロックを順次獲得していきます。このフェーズではロックの解放は一切行いません。
第2相(縮退相 / Shrinking Phase):すべてのロックを取得し終えたら、獲得済みのロックを解放していきます。このフェーズでは新たなロック獲得は一切行いません。
ここだけは確実に押さえてください。「成長相ではロック獲得のみ、縮退相ではロック解放のみ。2つのフェーズは絶対に交わらない」。これが核心です。
図解:2相ロッキングプロトコルのフェーズ遷移
2相ロッキングプロトコルの流れ
(全ロック獲得完了)
保持ロック数のイメージ
※ ロックポイントを境に「獲得→解放」へ不可逆的に切り替わる
なぜ直列化可能性を保証できるのか
2つのフェーズを分離する制約を全トランザクションに課すと、各トランザクションのロックポイント(全ロック獲得が完了した時点)の順序で、あたかもトランザクションを1つずつ順番に実行したのと同じ結果が得られます。
これを「直列化可能性(Serializability)」と呼びます。つまり、並行実行しても結果の正しさが数学的に保証されます。
デッドロックとの関係
2相ロッキングプロトコルはデッドロックの発生を防止しません。成長相で複数のトランザクションが互いに相手が保持するロックの解放を待つと、循環待ちが発生します。
デッドロックの回避には、ロック獲得の順序を全トランザクションで統一するなどの別の対策が必要です。
関連する同時実行制御手法との比較
| 手法 | アプローチ | 特徴 |
|---|---|---|
| 2相ロッキングプロトコル | ロック獲得と解放を2段階に分離 | 直列化可能性を保証するが、デッドロックは防げない |
| MVCC | データの「版(バージョン)」を保持し、読込みにロック不要 | 読込みと書込みが競合しないため同時実行性が高い |
| 2相コミットプロトコル | 分散DBで全サイトのコミット/中止を調停者が制御 | 分散トランザクションの原子性を保証する(ロック制御とは目的が異なる) |
特に「2相コミットプロトコル」は名前が紛らわしいため要注意です。
2相ロッキングプロトコルは「ロックの獲得と解放の順序を制御する手法」、2相コミットプロトコルは「分散データベースでコミットの整合性を取る手法」であり、対象も目的も異なります。
では、この用語が試験でどのように出題されるか見ていきましょう。
2相ロッキングプロトコルの核心を3行で
・ロック操作を「獲得のみ(成長相)」→「解放のみ(縮退相)」の2段階に分ける
・全トランザクションがこのルールに従うことで直列化可能性が保証される
・デッドロックの防止はできないため別途対策が必要
試験ではこう出る!
2相ロッキングプロトコルは、APの午前問題で同時実行制御の選択肢の1つとして登場するパターンが中心です。単体で深く問われるのはデータベーススペシャリスト試験に多く、AP対策では「他の手法との区別」ができれば十分です。
過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| FE R1秋 午前 問29 |
2相ロッキングプロトコルに従うトランザクションA・Bの同時実行でデッドロックが発生しない処理順序を選ぶ。 | ・ロック獲得順序が同一ならデッドロックは起きない ・共有ロックと専有ロックの可否判断が前提知識 |
| AP R7秋 午前 問29 |
トランザクションの同時実行性を高める仕組みとしてMVCCを選ばせる問題。選択肢に2相ロッキングプロトコルが登場。 | ・2相ロッキングプロトコルは「同時実行性を高める」仕組みではなく「直列化可能性を保証する」仕組み ・MVCCとの区別が問われた |
| DB R3秋 午前II 問13 |
2相ロック方式に関する記述として適切なものを選ぶ。 | ・「必要な全てのロックを獲得した後にだけロック解除できる」が正解 ・「デッドロックが発生しない」はひっかけ |
IPA試験での出題パターン
パターン1:「同時実行制御の手法を選べ」
AP R7秋 問29のように、MVCC・WALプロトコル・共有ロックなどと並列で提示される形式。「データの版を用意する」→MVCC、「ログを先行書き出し」→WAL、「ロック操作を2段階に分離」→2PLと瞬時に対応づけられればOK。
パターン2:「2相ロックの性質を選べ」
DB R3秋 問13のように、デッドロックとの関係が正しく理解できているか問う形式。「デッドロックが発生しない」は不正解。ここが最大のひっかけポイントです。
AP対策としては、「2PLは直列化可能性を保証する」「デッドロックは防げない」「2相コミットプロトコルとは別物」の3点を押さえておけば試験ではここまででOKです。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. 2相ロック方式を用いたトランザクションの同時実行制御に関する記述として、最も適切なものはどれでしょうか?
- A. 全てのトランザクションが直列に制御されるため、デッドロックが発生することはない。
- B. トランザクションは、必要な全てのロックを獲得した後にだけ、ロック解除命令を実行できる。
- C. トランザクション開始時点のデータの版(スナップショット)を参照することで、読込みにロックを必要としない。
正解と解説を見る
正解:B
解説:
2相ロック方式では、ロック獲得のフェーズ(成長相)が完了してから初めてロック解放のフェーズ(縮退相)に移行します。成長相と縮退相が交わることはないため、「全てのロックを獲得した後にだけロック解除を実行できる」が正しい記述です。DB R3秋 午前II 問13でこの形式が出題されています。
選択肢Aは「デッドロックが発生しない」と述べていますが、2相ロック方式でもトランザクション間のロック獲得順序によってはデッドロックが起こり得ます。選択肢Cは、データの版(スナップショット)を利用するMVCC(多版同時実行制御)の説明であり、ロック操作を2段階に分離する2相ロック方式とは異なる手法です。
よくある質問(FAQ)
Q. 厳密な2相ロック(Strict 2PL)と通常の2相ロックは何が違いますか?
通常の2相ロックは「成長相が終わった後に順次ロックを解放してよい」のに対し、厳密な2相ロック(S2PL)は「トランザクションのコミット時にまとめて全ロックを解放する」方式です。S2PLはカスケードロールバック(連鎖的な取り消し)を防止できる利点があり、多くの商用DBMSで採用されています。ただし、IPA試験のAP午前レベルではこの区別まで問われることはほぼないため、深追いは不要です。
Q. 2相ロッキングプロトコルと2相コミットプロトコルを混同しないコツはありますか?
「ロッキング」がつく方は「ロックの獲得・解放」の話、「コミット」がつく方は「分散データベースのコミット成否の合意」の話と、名前のキーワードで区別するのが確実です。2相ロッキングプロトコルは1つのデータベース内のロック順序制御、2相コミットプロトコルは複数サイト間の分散トランザクション管理と、適用範囲も異なります。AP R1秋 午前問30では2相コミットプロトコルが単体で出題されています。
Q. 実務では2相ロッキングプロトコルをどのDBMSが使っていますか?
MySQL(InnoDB)、PostgreSQL、Oracle Databaseなど主要なRDBMSは、内部的に厳密な2相ロック(S2PL)またはそのバリエーションを採用しています。ただし、PostgreSQLは読込みにはMVCCを併用し、書込みのみにロックを適用するハイブリッド型です。実務でSQL文を書く際に2PLを意識することはほとんどなく、DBMSが自動的にプロトコルに従ったロック管理を行います。
Q. 楽観的同時実行制御(楽観的ロック)と2相ロックはどちらが優れていますか?
一概には言えません。2相ロック(悲観的ロック)は競合が多い環境で確実にデータ整合性を守れますが、ロック待ちが頻発するとスループットが下がります。楽観的ロックは競合が少ない環境に向いており、コミット時にバージョン番号やタイムスタンプで競合を検出し、競合があればトランザクションを再実行します。AP午前では悲観的ロック(2PL系)が中心ですが、競合頻度に応じた使い分けの考え方自体は知っておくと応用が利きます。