データベーススペシャリスト 2015年 午前2 問13
問題文
2相ロック方式を用いたトランザクションの同時実行制御に関する記述のうち、適切なものはどれか。
選択肢
ア:全てのトランザクションが直列に制御され、デッドロックが発生することはない。
イ:トランザクションのコミット順序は、トランザクション開始の時刻順となるように制御される。
ウ:トランザクションは、自分が獲得したロックを全て解除した後にだけ、コミット操作を実行できる。
エ:トランザクションは、必要なロック獲得命令を全て実行した後にだけ、ロック解除命令を実行できる。(正解)
🔒 解説は解答すると表示されます
2相ロック方式【午前2解説】
正解の理由
2相ロック方式(2PL: Two-Phase Locking)は「ロック取得の増大相(growing phase)」と「ロック解放の縮小相(shrinking phase)」に処理を分けることで直列化可能性を保証する方式です。選択肢のうち、エは「必要なロック獲得命令を全て実行した後にだけ、ロック解除命令を実行できる」と述べており、まさに2PLの定義と一致します。すなわちトランザクションはまず必要なロックを(増大相で)取得し、その後はロックを解放するのみ(縮小相)であり、この順序制約が直列化性を保ちます。
ここで注意点として、2PLには派生があり、ロックの解放とコミットの関係が変わります。基本的な2PLでは縮小相でロックを解放することが可能であり、ロック解放がコミットより前に起こり得ます。一方で「厳格2PL(strict 2PL)」は排他ロック(書き込みロック)をコミットまで保持するという追加制約を課し、これにより未コミットデータを他に読ませない(カスケード中止を防ぐ)という利点が得られます。選択肢エは2PLの基本定義を正しく表現しています。
解法ステップ
- 問題文からキーワード「2相ロック方式」「同時実行制御」を抽出する。
- 2相ロック方式の定義を頭に描く:増大相(ロック取得のみ)→縮小相(ロック解放のみ)。
- 各選択肢と定義を照合する。
- 「増大相→縮小相」の順序を満たすか?
- デッドロックやコミット順、コミットとロック解放の関係について過度の一般化がないか確認する。
- 定義と整合する選択肢を選ぶ(今回は エ)。
選択肢別の誤答解説
-
ア: 「全てのトランザクションが直列に制御され、デッドロックが発生することはない。」
誤り。2PLは直列化可能性を保証するが、ロック競合によりデッドロックは発生し得る。デッドロックは2PLの典型的な問題であり、検出と回復や回避(タイムアウト、待ち死(wait‑die)/傷害(wound‑wait)など)が必要となる。 -
イ: 「トランザクションのコミット順序は開始時刻順となるように制御される。」
誤り。2PLはコミット順序を開始時刻順に強制しない。開始時刻とコミット順序は独立で、スケジューラや実装方針により変わる。タイムスタンプ方式など別の方式ではコミット順序に制約を課すことがあるが、2PL自体はそのような順序を要求しない。 -
ウ: 「トランザクションは、自分が獲得したロックを全て解除した後にだけ、コミット操作を実行できる。」
誤り。これは「コミットはロック解放の後でなければならない」と読むことができ、2PLの定義と逆になっている。基本的な2PLでは縮小相でロックを解放できるため、ロック解放がコミットより前に起こりうる(よって「必ず解放後にしかコミットできない」という主張は成り立たない)。一方で厳格2PLでは排他ロックをコミットまで保持するため、解放はコミット後に行われるが、これは2PL全体の定義ではなく派生ルールである。 -
エ: 「トランザクションは、必要なロック獲得命令を全て実行した後にだけ、ロック解除命令を実行できる。」
正しい。これは増大相(ロック取得のみ)→縮小相(ロック解放のみ)という2PLの根幹を述べているため、2PLの定義に一致する。
よくある誤解
-
2PL=コミット前に常にロックを保持する、ではない
- 「コミット前にロックを保持する」とする記述は厳格2PLの説明に該当する。基本2PLでは縮小相でロックを解放でき、コミットの前に解放される場合もある。厳格性の有無を区別して理解すること。
-
2PLはデッドロックを防ぐわけではない
- 直列化は保証するが、待ちループによるデッドロックは発生する。適切なデッドロック検出・回復や回避手法が必要。
-
直列化=実行順序の固定、ではない
- 直列化可能性は「並行実行がある等価な直列実行が存在する」ことを意味するが、実際の実行順序が直列順に強制されるわけではない。
補足コラム
主な2PLの変種と特徴:
- 基本2PL:増大相→縮小相を守ることで直列化可能。デッドロックは発生し得る。
- 厳格2PL(Strict 2PL):排他ロックをトランザクションのコミット(またはロールバック)まで保持する。これにより未コミットデータを他が読めず、カスケード中止を防止する(回復が容易)。
- 積極的(Conservative)2PL:トランザクション開始時に必要な全ロックを事前取得し、取得できなければ開始を遅らせることでデッドロックを回避する。
デッドロック対策としては、タイムアウト、待ちグラフによる検出と解除、待ち方針(wait‑die、wound‑wait)などが実務で使われます。
FAQ
Q1: 2PLは常に安全(recoverable)ですか?
A1: 基本2PLは直列化可能性を保証するが、未コミットデータの読取によるカスケード中止を防ぐ保証はない。厳格2PLは排他ロックをコミットまで保持するため、カスケード中止を防ぎ回復性が高い。
A1: 基本2PLは直列化可能性を保証するが、未コミットデータの読取によるカスケード中止を防ぐ保証はない。厳格2PLは排他ロックをコミットまで保持するため、カスケード中止を防ぎ回復性が高い。
Q2: 2PLでデッドロックが起きたらどうする?
A2: 一般的にはデッドロック検出(待ちグラフでサイクル検出)→一つのトランザクションを強制中止してリソースを解放する、または回避アルゴリズム(事前ロック取得やタイムアウト)を用いる。
A2: 一般的にはデッドロック検出(待ちグラフでサイクル検出)→一つのトランザクションを強制中止してリソースを解放する、または回避アルゴリズム(事前ロック取得やタイムアウト)を用いる。
Q3: ロックの種類は何がある?
A3: 主に共有ロック(S: read)と排他ロック(X: write)。Sは複数同時に保持可能、Xは単独で保持。
A3: 主に共有ロック(S: read)と排他ロック(X: write)。Sは複数同時に保持可能、Xは単独で保持。
関連キーワード: 2相ロック, 2PL, 厳格2PL, 直列化可能性, デッドロック, ロック管理, カスケード中止

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

