トランザクションA(処理A1→処理A2の順に実行する)とトランザクションB(処理B1→処理B2の順に実行する)が,データベースの資源SとTに対し,次のように処理A1→処理B1→処理A2→処理B2の順で専有ロックを要求する場合,デッドロックが発生する資源の組合せはどれか。
なお,ロックは処理開始時にかけ,トランザクション終了時に解除する。
トランザクションA:処理A1→処理A2→COMMIT
トランザクションB:処理B1→処理B2→COMMIT
正答2
解説
正解は2です。
二つのトランザクションが資源SとTに専有ロックをかける順序から、デッドロックが起きる組合せを問う問題です。
ロックは各処理の開始時にかけ、COMMIT(トランザクション終了)まで解除しません。
処理はA1、B1、A2、B2の順に要求されます。
デッドロックは、AとBが互いに相手のロックしている資源を待つときに起きます。
【選択肢別解説】
1:× A1がSをロックし、B1はSを要求してAの終了を待ちます。
A2はTをロックでき、AがCOMMITしてSを解放するので、Bも続行できます。
2:○ A1がS、B1がTをロックします。
A2はBが持つTを待ち、B2はAが持つSを待つので、互いに待ち合ってデッドロックになります。
3:× A1がT、B1がSをロックします。
A2はA自身が持つTを使い、B2はB自身が持つSを使うので、待ちは生じずデッドロックは起きません。
4:× A1がTをロックし、B1はTを要求してAを待ちます。
A2はSをロックしてCOMMITし、Tを解放するので、Bも続行できます。
【ポイント】
デッドロックは、二つのトランザクションが複数の資源を異なる順序でロックするときに起きます。
資源をロックする順序を全トランザクションで統一することが、代表的な予防策です。