データベーススペシャリスト 2021年 午前2 問13
問題文
2相ロック方式を用いたトランザクションの同時実行制御に関する記述のうち適切なものはどれか。
選択肢
ア:全てのトランザクションが直列に制御されデッドロックが発生することはない。
イ:トランザクションのコミット順序はトランザクション開始の時刻順となるように制御される。
ウ:トランザクションは自分が獲得したロックを全て解除した後にだけコミット操作を実行できる。
エ:トランザクションは必要な全てのロックを獲得した後にだけロックを解除できる。(正解)
🔒 解説は解答すると表示されます
二相ロック方式【午前2解説】
正解の理由
二相ロック方式(2PL: Two-Phase Locking)は、各トランザクションが「ロックを獲得する成長(成長)フェーズ」と「ロックを解放する縮小(縮小)フェーズ」に分かれることを要求します。成長フェーズでは任意にロックを取得できますが、一度縮小フェーズ(=最初のロック解放)に入ると以後は新たなロックを獲得できません。つまり、必要な全てのロックは解放を始める前に取得しておかねばならず、この性質を述べた選択肢が正しいため、エが正答です。
解法ステップ
- 問題文が扱うプロトコル(2PL)の本質を確認する:成長フェーズと縮小フェーズの存在。
- 各選択肢を2PLの定義に照らして真偽を判定する:
- 2PLは直列化(serializability)を保証するが、直列実行そのものを強制するわけではない点に注意。
- 2PLがコミット順序やデッドロックの不発生を保証するかを検討する。
- いつロックを獲得・解放できるか(獲得は解放前、解放は獲得後)を照合する。
- 条件に一致する文を選ぶ(成長→縮小の順序制約を満たすものを選ぶ)。
選択肢別の誤答解説
- ア: 「全てのトランザクションが直列に制御されデッドロックが発生することはない。」
- 誤り。2PLは直列化可能性(並行実行の結果がある直列実行の結果と同等になること)を保証しますが、トランザクションを直列に実行することを意味しません。複数トランザクションが同時に動作するため、相互にロック待ちが発生してデッドロックが起きる可能性があります。デッドロックを防ぐためには別途デッドロック検出やタイムアウト、待ち方の優先ルール(wait-die, wound-wait など)が必要です。
- イ: 「トランザクションのコミット順序はトランザクション開始の時刻順となるように制御される。」
- 誤り。2PLは開始時刻順にコミットさせることを要求しません。コミット順序は実行の進行状況や同期状態に依存し、開始時刻に従う必要はありません。開始時刻順の制御はタイムスタンプ方式など別の制御法の性質です。
- ウ: 「トランザクションは自分が獲得したロックを全て解除した後にだけコミット操作を実行できる。」
- 誤り。実務や多くのプロトコルではコミット操作が完了した後にロックを解放します(特に厳格二相ロック(Strict 2PL)では排他ロックをコミットまたはロールバックまで保持する)。選択肢の文は「先に全解除→その後コミット」と解釈され、実際の運用と逆です。
- エ: 「トランザクションは必要な全てのロックを獲得した後にだけロックを解除できる。」
- 正解。これは2PLの本質を表す文です。重要点は「一度ロックの解放(縮小フェーズ)を始めると、以後ロックを獲得できない」という制約です(=必要な全ロックは解放前に獲得しておく必要がある)。これにより、2PLは実行がある直列順序に相当することを保証します。
よくある誤解
- 「2PLはデッドロックを防ぐ」
- 誤り。2PLは直列化を保証しますが、デッドロックの発生を防ぐものではありません。デッドロック検出・回復や待ち方のポリシーが別途必要です。
- 「コミットの前にロックを全部解除しなければならない」
- 誤り。多くの実装(特に厳格2PL)ではコミット後にロックを解放します。解除→コミットの順は誤った認識です。
補足コラム
- 2PLのバリエーション:
- 基本2PL:成長→縮小の順を守れば直列化可能だが、トランザクションが中間で読み取った値が将来ロールバックされるといった回復性の問題がある。
- 厳格2PL(Strict 2PL):排他ロック(書き込みロック)をトランザクションのコミットまたはロールバックまで保持することで、回復性(recoverability)とカスケードロールバックの防止を両立する。
- デッドロック対応の代表例:タイムアウト、待ち行列のグラフに基づく検出(循環検出)と中止、優先ルール(wait-die、wound-wait)など。
- 簡単な時間軸イメージ:
- 成長フェーズ: acquire(A), acquire(B), ... → 最初の release が起きるまで続く
- 縮小フェーズ: release(X), release(Y), ...(この縮小開始後は acquire は不可)
FAQ
Q1: 2PLと厳格2PLは何が違いますか?
A1: 2PLは「獲得→解放の順序」を守れば直列化を保証します。厳格2PLはさらに「排他ロックをコミットまたはロールバックまで解放しない」ことで、回復性やカスケードロールバックの防止を実現します。
A1: 2PLは「獲得→解放の順序」を守れば直列化を保証します。厳格2PLはさらに「排他ロックをコミットまたはロールバックまで解放しない」ことで、回復性やカスケードロールバックの防止を実現します。
Q2: 2PLだけでトランザクションの安全性は十分ですか?
A2: 直列化は保証されますが、デッドロックや回復性(障害時の整合性)など別問題が残るため、実運用ではデッドロック対策や厳格2PLの採用、ログによる回復手法などを組み合わせます。
A2: 直列化は保証されますが、デッドロックや回復性(障害時の整合性)など別問題が残るため、実運用ではデッドロック対策や厳格2PLの採用、ログによる回復手法などを組み合わせます。
Q3: ロックの「アップグレード(共有→排他)」は2PLで許されますか?
A3: 許されますが、アップグレード中に他トランザクションと競合するとデッドロックの原因になり得ます。設計上は注意が必要です。
A3: 許されますが、アップグレード中に他トランザクションと競合するとデッドロックの原因になり得ます。設計上は注意が必要です。
関連キーワード: 二相ロック, 成長フェーズ, 縮小フェーズ, 直列化, デッドロック

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

