戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

データベーススペシャリスト 2012年 午前219


問題文

二つのトランザクションT1, T2が、データa, bに並行してアクセスする。T1, T2の組合せのうち、直列可能性を保証できるものはどれか。ここで、トランザクションの各操作の意味は次のとおりとする。
LOCK   :データxをロックする READ   :データxを読み込む WRITE   :データxを書き出す UNLOCK  :データxをアンロックする
データベーススペシャリスト 2012年 午前2 問19の選択肢の画像

選択肢

(正解)

🔒 解説は解答すると表示されます

二相ロックと直列可能性【午前2解説】

正解の理由

並行実行の直列可能性(conflict serializability)は、各トランザクションがロックの「獲得(成長)段階」と「解放(縮小)段階」を一度しか行わない、いわゆる二相ロック(2PL)を満たしているときに保証されます。選択肢のうち、両トランザクションがロックを取得した後にいかなるロックも再取得せず、かつアクセス順序(a→b)が揃っているために2PLが守られているものは です。したがって の組合せでは競合によるサイクル(依存グラフの循環)が発生せず、直列可能性が保証されます。

解法ステップ

  1. 各トランザクションのロック(LOCK)とアンロック(UNLOCK)の順序を確認する。
  2. 「一度アンロックした後に新たなロックを取得していないか」を判定する(これが2PLの要件)。
  3. すべてのトランザクションが2PLを満たしていれば直列可能性は保証される。満たさないものがあれば、非直列スケジュールが生じる可能性があるため不正解とする。
  4. 必要なら競合(同一データへの読み/書き)の向きを見て依存グラフの循環の有無を想定する。

選択肢別の誤答解説

  • ア:両トランザクションともに一見同一の操作順序に見えるが、図の通り最初にREADが来てその後でLOCKがあるなど「アクセスがロック外で行われている」部分があり、ロック制御の前提が破られている。また、LOCK/UNLOCKの扱いが正しくない(ロック取得前の読みや、操作順の不整合)と判断され、2PLに基づく直列化保証が成立しない。したがって直列可能性は保証できない。
  • イ:T1・T2ともに a のロックを取得してから処理し、その後アンロックしてから b のロックを再取得している。つまり「アンロック後に別のロックを取得している」ため、各トランザクションが2PL(成長→縮小を一度だけ)の条件を満たしていない。2PL違反のため直列可能性は保証されない。
  • ウ:T1がaをアンロックした後にbのロックを取得しており、これによりT1は2PLを満たさない。T2はa→bの順にロックしているように見えるが、少なくとも一方のトランザクションが2PLを破っているので、全体として直列可能性は保証されない。
  • エ:両者ともロックの獲得は a → b の順で行い、アンロックは処理の後にまとめて行っている(アンロックしたあとに新たにロックを取ることはない)。つまり各トランザクションが2PLを満たしており、競合直列化が保証されるため直列可能性が成立する。

よくある誤解

  • 「デッドロックの有無=直列可能性の可否」ではない:デッドロックはロックの相互待ち(循環待ち)で発生する問題だが、直列可能性は操作順序に基づく競合の向き(依存グラフの循環)で判断する。両者は関連するが同一概念ではない。
  • 「ロックの解放順(UNLOCKの順序)が違うと直列化できない」わけではない:重要なのは「一度ロックを解放した後に新たなロックを取得していないか」つまり2PLを満たしているかどうか。解放の順序自体は縮小段階の一部であり、直列化の成立に直接影響しない場合が多い。
  • 「同じロック順序なら常に安全」ではない:同順序のロック取得はデッドロック回避に有効だが、各トランザクションが途中でロックを解放してから再取得するような2PL違反があれば非直列スケジュールが起こりうる。

補足コラム

  • 2PL(二相ロック)の定義:トランザクションは「成長期(ロックの取得のみ)」と「縮小期(ロックの解放のみ)」の二段階で動作し、縮小期に入った後は新たなロックを取得してはならない。基本2PLはこれにより競合直列化(conflict serializability)を保証する。
  • strict 2PL(厳格2PL):排他ロックをコミットまで解放しないなどさらに強い条件で、リカバリ上の利点(ロールバック時の不整合回避)を持つ。問題文では基本的な2PLの遵守が問われている。
  • 依存グラフの観点:操作間の競合(W→R, R→W, W→W)によりトランザクション間に辺を張ったとき、サイクルがあれば非直列可能。2PLを守ればこのサイクルがそもそも作られない。

FAQ

Q1. 2PLを満たしていれば常に安全か?
A1. はい、基本2PLをすべてのトランザクションが遵守していれば、競合直列化(直列可能性)は保証されます。ただし実装上はデッドロックや待機の問題が生じ得ます。
Q2. UNLOCKの順序(bを先に解放する等)は気にする必要があるか?
A2. 直列可能性の観点では、解放順自体は問題になりません。重要なのは解放後に新たなロック取得がないこと(2PL遵守)。ただし解放順はデッドロック回避や性能に影響します。
Q3. 同じロック順序でも2PL違反なら直列化は保証されない?
A3. その通りです。ロック順序の一致はデッドロック低減に有効ですが、途中でロックを解放して再取得するなど2PLに反する振る舞いがあれば非直列スケジュールを生む可能性があります。

関連キーワード: 二相ロック, 2PL, 直列可能性, 競合直列化, 依存グラフ, デッドロック, ロック順序
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリスト
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について