【データベース】ロックの「獲得」と「解放」は混ぜるな危険!「2相ロックプロトコル」|情報処理問題1000本ノック
複数のユーザーが同時にデータを書き換えても、絶対にデータが矛盾しないようにするための厳格なルール。2フェーズコミットとの違いを意識しながら「2相ロック」を攻略しましょう。
1. 【 問題 】:同時実行制御における2相ロックプロトコル
【 問題 】 データベース管理システム(DBMS)において、複数のトランザクションが同時に実行された場合でも、それらを順番に一つずつ実行したときと同じ正しい結果(直列可能性)を保証するための排他制御プロトコル(ルール)はどれでしょうか?
① トランザクションの開始から終了(コミット)まで、一切のロック解除を行わず、最後にすべてのロックを一度に解放する方式。
② 必要なロックをすべて獲得する「成長相(拡大相)」と、一度でもロックを解除した後は新しいロックを一切獲得できない「収縮相」の2つの期間に分ける方式。
③ 主サーバー(コーディネーター)が、複数の従サーバー(コホート)に対して一斉に「確約準備(プリペア)」と「確約(コミット)」の2段階でデータ変更の同期を指示する方式。
④ データの読み込み時には「共有ロック」をかけ、書き込み時には「占有ロック」をかけ、読み終わった瞬間に即座にロックを解除していく方式。
2. 正解:
正解: ② 必要なロックをすべて獲得する「成長相(拡大相)」と、一度でもロックを解除した後は新しいロックを一切獲得できない「収縮相」の2つの期間に分ける方式。
3. 解説:「ロックの追加」と「ロックの解放」のフェーズを完全分離する
データベースの同時実行制御(排他制御)において、ただ「使う前にロックして、使い終わったら外す」という個別の処理をバラバラに許可していると、複数のトランザクションが絡み合ったときにデータの整合性が崩れてしまうことがあります。それを防ぐためのルールが2相ロックプロトコル(2PL)です。
1. 成長相(拡大相):トランザクションが始まり、必要なデータに次々と鍵をかけていく(ロックを獲得していく)フェーズです。この期間中は、いかなるロックの解除(解放)も許されません。
2. 収縮相:用が済んだデータから鍵を外していく(ロックを解放していく)フェーズです。この期間に入ると、新しいロックを新しく獲得することは一切禁止されます。 ← ココが問題の正解!
・この「一度でも解放し始めたら、もう二度と新しい鍵はかけられない」という単純な一方向のルールを守るだけで、数学的にデータの整合性(直列可能性)が完全に保たれることが証明されています。
・ただし、お互いが相手のロック解除を待ってしまう「デッドロック」は発生するリスクがあるため、DBMSは別途デッドロック検知機能などで対策をしています。
★ ①:これは2相ロックのさらに厳しい特例である「厳密な2相ロック(SS2PL)」の説明です。実務ではよく使われますが、一般的な2相ロックの定義は②になります。
★ ③:これが、あなたが指摘してくださった「2フェーズコミット(2PC)」の記述です!ネットワークで繋がった複数のデータベース間でデータを同時に確定させる『同期技術』であり、排他制御のルールである2相ロックとは名前が似ているだけの別物です。
★ ④:その都度ロックをかけて即解放するバラバラな方式です。これでは2つの処理が干渉し合ってデータの矛盾が発生するため、2相ロックのルール違反となります。
1. 理解のコツ: 「大事な書類をいくつか使って行う手続き」に例えてみましょう。
・手続きに必要なファイルを1冊ずつ棚から取って机に集めます(成長相)。途中で「あ、このファイルもう使わないから棚に戻そう」として戻した後に、「あ!やっぱり別のあのファイルも必要だった!」と再度別のファイルを取りに行く行為を禁止するのがこのルールです。
・すべての書類が集まるまでは1冊も返却せず、一度でも返却を始めたら(収縮相)、あとはひたすら返すだけにする。こうすることで、他の人が「中途半端に書き換えられた書類」にアクセスして勘違いするのを防ぐことができます。
2. 試験対策の視点: 「成長相(拡大相)」「収縮相」「直列可能性(整合性)を保証する」というキーワードが並んだら「2相ロックプロトコル」が一択です。午前試験では、問題文に「2相ロックプロトコルの説明として適切なものはどれか」として出題され、選択肢の中に必ず「2段階に分けてコミットを……」という2フェーズコミットの罠(選択肢③のような記述)が仕込まれます。ここを「これは別物!」と一瞬で見破れるかどうかが、合格者と不合格者を分ける決定的な境界線になります。
4. まとめ
「トランザクション中のロック動作を『増やすだけの期間』と『減らすだけの期間』の2つにスッパリ分けることで、並行処理によるデータのバグを防ぐ排他制御プロトコル」。これが2相ロックプロトコルです。「2相ロック=データに鍵をかけるルール」「2フェーズコミット=みんなでせーので保存するルール」という役割の違いを脳内でガチッと固定しておきましょう!