データベーススペシャリスト 2023年 午前2 問12
問題文
相ロック方式を用いたトランザクションの同時実行制御に関する記述のうち、適切なものはどれか。
選択肢
ア:全てのトランザクションが直列に制御され、デッドロックが発生することはない。
イ:トランザクションのコミット順序は、トランザクション開始の時刻順となるように制御される。
ウ:トランザクションは、自身が獲得したロックを全て解除した後にだけ、コミット操作を実行できる。
エ:トランザクションは、必要な全てのロックを獲得した後にだけ、ロックを解除できる。(正解)
🔒 解説は解答すると表示されます
二相ロック方式【午前2解説】
正解の理由
選択肢エが正しいのは、二相ロック方式(Two-Phase Locking, 2PL)の定義に合致するためです。2PLではトランザクションのロック操作が「獲得(増大)フェーズ」と「解放(縮小)フェーズ」の2段階に分かれます。増大フェーズで必要なロックを取得し、縮小フェーズに入ってロックを解放し始めたら以降は新たなロックを取得できません。したがって「必要な全てのロックを獲得した後にだけ、ロックを解除できる」という趣旨が2PLの本質を表しています。
補足として、2PLはシリアライズ可能性を保証しますが、ロックの解放タイミングには派生があり、特に strict 2PL では排他(X)ロックをコミットまで保持するという制約があり、これによりリカバリ(カスケードロールバックの防止)が容易になります。ここでの正解は一般的な2PLの「増大→縮小」の原則を示すものです。
解法ステップ
- 問題文が問う概念を「ロックの取得と解放の順序」に絞る。
- 2PLの定義を思い出す:ロック操作は「増大(獲得)」と「縮小(解放)」の2フェーズで行われること。
- 各選択肢を2PLの定義および派生(strict 2PL など)と照合する。
- 「獲得が先、解放はその後」である選択肢が一致するものを正解と判断する(すなわち選択肢エ)。
選択肢別の誤答解説
- ア: 「全てのトランザクションが直列に制御され、デッドロックが発生することはない。」
- 誤り。2PLはスケジュールのシリアライズ可能性(直列化可能な結果)を保証しますが、トランザクションが必ず直列実行されるわけではなく、並行実行は行われます。並行性によりロック競合が生じるため、デッドロックは発生し得ます。2PLはデッドロックを防ぐ仕組みではありません(検出・回避・予防の別途対策が必要)。
- イ: 「コミット順序は、トランザクション開始の時刻順となるように制御される。」
- 誤り。2PLは開始時刻順にコミットさせるような制御を行いません。コミット順はトランザクションの実行状況に依存し、開始時刻順に強制されることはありません。したがってコミット順序と開始時刻は無関係です。
- ウ: 「トランザクションは、自身が獲得したロックを全て解除した後にだけ、コミット操作を実行できる。」
- 誤り。一般的な2PLではコミットはトランザクションの終了時に行われますが、ロックをすべて解放してからコミットする、という順序を必須とするものではありません。むしろ strict 2PL の場合は排他ロックをコミットまで保持し、コミット時に解放する方式であり、解放→コミットの強制は当てはまりません。ウの記述は逆の順序を要求しており不正確です。
よくある誤解
- 「二相ロックはコミット後に必ずロックを解除する」
- 誤解。標準的な2PLの原則は「増大(獲得)→縮小(解放)」であり、縮小フェーズに入った後は新たなロックを取れませんが、解放のタイミング自体は実装に依存します。strict 2PL では排他ロックをコミットまで保持してから解放しますが、通常の2PLではコミット前に一部ロックを解放する実装もあり得ます。
- 「2PLはデッドロックを防ぐ」
- 誤解。2PLはシリアライズ可能性を保証しますが、ロック競合によりデッドロックが発生する可能性は残ります。デッドロック対策(タイムアウト、待ちグラフ検出+ロールバック、順序付けによる事前回避など)が別途必要です。
- 「strict 2PL と 2PL は同じ」
- 誤解。strict 2PL(厳格2PL)は排他ロックをコミットまで保持する追加制約があり、これによりカスケードロールバックを防げる点で違います。一般的な2PLはより緩い定義です。
補足コラム
- 2PLのバリエーション
- strict 2PL:排他ロックをトランザクションのコミット(またはロールバック)まで保持する。これにより他トランザクションが未コミットデータを読み取れず、カスケードロールバックを防止できる。
- rigorous 2PL:共有ロックも含めて全てのロックをコミットまで保持する。より厳格で安全性が高いが並行性は低下する。
- シリアライズ可能性との関係
- 2PLを満たすスケジュールは常にシリアライズ可能であるため、一貫性を保てます。逆は成り立ちません(シリアライズ可能でも2PLを必ず満たすとは限らない)。
- 実装上の注意点
- ロックの種類(共有Sロック、排他Xロック)、ロックの昇格(S→X)やデッドロック検出(待ちグラフ)手法などが重要です。
FAQ
Q1: 2PLだけでデータ整合性と回復性は十分ですか?
A1: 整合性(シリアライズ可能性)は保証されますが、回復性(カスケードロールバックの防止)は strict 2PL のような追加制約が必要です。ログやトランザクションログ(WAL)と組合せたリカバリ手法も必須です。
A1: 整合性(シリアライズ可能性)は保証されますが、回復性(カスケードロールバックの防止)は strict 2PL のような追加制約が必要です。ログやトランザクションログ(WAL)と組合せたリカバリ手法も必須です。
Q2: 一度ロックを解放したら再びロックを取れるか?
A2: 2PLのルールでは、一度縮小(解放)フェーズに入ったら以降は新しいロックを取得できません。従って解放後に再取得することは原則としてできません。
A2: 2PLのルールでは、一度縮小(解放)フェーズに入ったら以降は新しいロックを取得できません。従って解放後に再取得することは原則としてできません。
Q3: strict 2PL と rigorous 2PL の違いは?
A3: strict 2PL は排他ロックのみをコミットまで保持します。rigorous 2PL は共有ロックも含め全てのロックをコミットまで保持します。rigorous の方がさらに厳格でリカバリに有利ですが、並行性は低下します。
A3: strict 2PL は排他ロックのみをコミットまで保持します。rigorous 2PL は共有ロックも含め全てのロックをコミットまで保持します。rigorous の方がさらに厳格でリカバリに有利ですが、並行性は低下します。
関連キーワード: 二相ロック, 2PL, 増大フェーズ, 縮小フェーズ, strict 2PL, シリアライズ可能性, デッドロック, ロック解放タイミング, ロック昇格

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

