基本情報技術者 2019年 秋期 午前(科目A) 問29
問題文
2相ロッキングプロトコルに従ってロックを獲得するトランザクションA,Bを図のように同時実行した場合に、デッドロックが発生しないデータ処理順序はどれか。ここで、readとupdateの位置は、アプリケーションプログラムでの命令発行時点を表す。また、データWへのreadは共有ロックを要求し、データX, Y, Zへのupdateは各データへの専有ロックを要求する。


選択肢
ア:
イ:
ウ:(正解)
エ:
🔒 解説は解答すると表示されます
相ロッキングプロトコルのデッドロック判定【午前解説】
正解の理由
選択肢ウではBがまずXの排他ロックを取得し、その後Wを共有で取得、続けてY→Zの排他ロックを要求します。AはW(共有)→X(排他)→Y(排他)→Z(排他)という順序です。
どの順序で並行実行されても、AとBが互いにXとYをそれぞれ片方ずつ保持して相手が持つもう一方を待つ、つまりAがXを持ってYを待ち、同時にBがYを持ってXを待つような「循環待ち」は起こりません。したがってデッドロックが発生しません。
どの順序で並行実行されても、AとBが互いにXとYをそれぞれ片方ずつ保持して相手が持つもう一方を待つ、つまりAがXを持ってYを待ち、同時にBがYを持ってXを待つような「循環待ち」は起こりません。したがってデッドロックが発生しません。
解法ステップ
- 各操作が要求するロック種別を明確にする(read→共有、update→排他)。
- Aの固定順序(W→X→Y→Z)と、選択肢で示されるBの順序を並べる。
- 排他ロック同士(X,Y,Z)に注目し、AとBがそれらを逆順に保持して互いに待つ循環(A:X→待Y, B:Y→待X)が起き得るか検討する。
- 循環が発生し得ればその選択肢は誤り、発生し得なければ正解とする。
選択肢別の誤答解説
- ア:① read W、② update Y、③ update X、④ update Z
両者とも最初にWを共有で取れるため、AがXを取りBがYを取るように進行すると、AがYを待ち、BがXを待つ循環待ちが発生する可能性があります(デッドロックあり)。 - イ:① read W、② update Y、③ update Z、④ update X
同様にA:X → 待YとB:Y → 待Xの逆順ロック獲得が起こり得て、デッドロックが発生します。 - ウ:① update X、② read W、③ update Y、④ update Z
Bが先にXを取得するため、AとBがXとYを互いに保持して待つような循環が発生しません。よってデッドロックは回避できます(正解)。 - エ:① update Y、② update Z、③ update X、④ read W
Bが先にYを取得し、Aが先にXを取得する状況が生じるとAがYを待ちBがXを待つ循環が発生し得ます(デッドロックあり)。
よくある誤解
- 共有ロック(read W)は排他ロックと常に競合すると思い込む誤解:共有ロック同士は互いに干渉せず同時保持できます。
- 2PL(相ロッキング)なら必ずデッドロックを防げるという誤解:2PLは整合性を保証しますが、デッドロック自体は発生し得ます。
- 「すべてのロックを先に獲得すれば安全」と考える誤解:先行取得による待ちが逆にデッドロックを誘発する場合があります。
補足コラム
相ロッキングプロトコル(問題文の文脈では通常「二相ロッキング(2PL)」を指します)は、トランザクションがロックを獲得する段階(成長期)と解放する段階(縮小期)を分ける方式です。2PLは一貫性を保ちますが、デッドロックを自動で防ぐものではありません。現実のDBMSではデッドロック回避(タイムアウト、wait-die/wound-wait)や検出(待ち合わせグラフの周期検査)といった補助策を併用します。
FAQ
Q1: なぜread W(共有ロック)はデッドロックを起こしにくいのですか?
A1: 共有ロック同士は互いに共存できるため、複数のトランザクションが同時にWを読むことはブロックし合いません。衝突は排他ロックとの間で起きます。
A1: 共有ロック同士は互いに共存できるため、複数のトランザクションが同時にWを読むことはブロックし合いません。衝突は排他ロックとの間で起きます。
Q2: もしトランザクションがロックを途中で解放したら結果は変わりますか?
A2: はい。途中解放が許されると循環待ちの形が変わり得ますが、2PL(特に厳密2PL)では通常コミットまで解放しないため、問題文の前提では考慮不要です。
A2: はい。途中解放が許されると循環待ちの形が変わり得ますが、2PL(特に厳密2PL)では通常コミットまで解放しないため、問題文の前提では考慮不要です。
Q3: デッドロックを確実に避ける方法はありますか?
A3: 完全に避けるにはグローバルなロック順序を決めて強制する(全トランザクションが同じ順序でロックを取る)などの方法がありますが、性能や柔軟性のトレードオフがあります。
A3: 完全に避けるにはグローバルなロック順序を決めて強制する(全トランザクションが同じ順序でロックを取る)などの方法がありますが、性能や柔軟性のトレードオフがあります。
関連キーワード: デッドロック、二相ロッキング、共有ロック、排他ロック、待ち合わせグラフ、ロック獲得順序

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

