2相ロッキングプロトコルに従ってロックを獲得するトランザクションA,Bを図のように同時実行した場合に,デッドロックが発生しないデータ処理順序はどれか。
ここで,readとupdateの位置は,アプリケーションプログラムでの命令発行時点を表す。
また,データWへのreadは共有ロックを要求し,データX,Y,Zへのupdateは各データへの専有ロックを要求する。
正答3
解説
正解は3です。
2相ロッキングプロトコルでは、トランザクションは必要なロックを全て獲得し終えるまでロックを解放しません。
デッドロックは、2つのトランザクションが互いに相手の持つロックを待ち合うと発生します。
共有ロック(read)どうしは両立しますが、専有ロック(update)は他のロックと両立しません。
図より、トランザクションAはread W、update X、update Y、update Zの順にロックを要求します。
【選択肢別解説】
1:× BがYを専有ロックした後でXを要求します。
AがXをロックしてYを待ち、BがYをロックしてXを待つと、互いに待ち合ってデッドロックになります。
2:× BはY、Zを先にロックしてから最後にXを要求します。
AがXを持ってYを待ち、BがYを持ってXを待つ状況が起こり、デッドロックになります。
3:○ BもAと同じくX、Y、Zの順に専有ロックを要求します。
先にXを獲得した方が最後まで進み、もう一方はXを待つだけなので、待ち合いの輪ができません。
read Wは共有ロックなのでAと競合しません。
4:× BがY、Zを先にロックしてからXを要求します。
AがXを持ってYを待つと、BはXを待つことになり、デッドロックになります。
【ポイント】
デッドロックを防ぐ代表的な方法は、全てのトランザクションで資源をロックする順序をそろえることです。
専有ロックの要求順がAと同じかどうかに注目すると、すぐに答えを絞れます。