トランザクションAとBが,共通の資源であるテーブルaとbを表に示すように更新するとき,デッドロックとなるのはどの時点か。
ここで,表中の①~⑧は処理の実行順序を示す。
また,ロックはテーブルの更新直前にテーブル単位で行い,アンロックはトランザクション終了時に行うものとする。
表/トランザクションA|トランザクションB/①トランザクション開始|/|②トランザクション開始/③テーブルa更新|/|④テーブルb更新/⑤テーブルb更新|/|⑥テーブルa更新/⑦トランザクション終了|/|⑧トランザクション終了
正答4
解説
正解は4です。
デッドロックは、2つのトランザクションが互いに相手のロックしている資源の解放を待ち、どちらも先に進めなくなる状態です。
問題文の条件では、テーブルを更新する直前にロックし、トランザクションの終了時までロックを解放しません。
【処理の流れ】
③でトランザクションAがテーブルaをロックして更新します。
④でトランザクションBがテーブルbをロックして更新します。
⑤でAがテーブルbを更新しようとしますが、Bがロックしているので待ち状態になります。
⑥でBがテーブルaを更新しようとしますが、Aがロックしているので待ち状態になります。
この時点で、AはBの終了を、BはAの終了を待つことになり、デッドロックになります。
【選択肢別解説】
1:× ③ではAがテーブルaをロックするだけで、競合はまだ起きていません。
2:× ④ではBがテーブルbをロックするだけで、テーブルaとは競合しません。
3:× ⑤ではAがBの終了を待つ状態になりますが、Bはまだ処理を進められます。
片方が待っているだけなので、デッドロックではありません。
4:○ ⑥でBもAの終了を待つ状態になり、互いに相手を待ち合う循環が完成します。
ここでデッドロックが成立します。
【ポイント】
デッドロックを防ぐには、すべてのトランザクションで資源をロックする順序をそろえる方法が有効です。
本問でもBがテーブルa、bの順にロックすれば、デッドロックは起こりません。