トランザクションAとBが、共通の資源であるテーブル a と b を表に示すように更新するとき、デッドロックとなるのはどの時点か。ここで、表中の①~⑧は処理の実行順序を示す。また、ロックはテーブルの更新直前にテーブル単位で行い、アンロックはトランザクション終了後に行うものとする。
┌─────────────┬─────────────┐
│ トランザクションA │ トランザクションB │
├─────────────┼─────────────┤
││① トランザクション開始 │ │
│├─────────────┼─────────────┤
││ │② トランザクション開始 │
│├─────────────┼─────────────┤
││③ テーブルa更新 │ │
│├─────────────┼─────────────┤
時││ │④ テーブルb更新 │
間│├─────────────┼─────────────┤
││⑤ テーブルb更新 │ │
│├─────────────┼─────────────┤
││ │⑥ テーブルa更新 │
│├─────────────┼─────────────┤
││⑦ トランザクション終了 │ │
│├─────────────┼─────────────┤
↓│ │⑧ トランザクション終了 │
└─────────────┴─────────────┘
ア ③ イ ④ ウ ⑤ エ ⑥
エ
デッドロックは例えば、今、処理Aが資源aを使っていて、次に資源bを使おうとしている一方で、処理Bは資源bを使っていて、次に資源aを使おうとしている時、処理Aも処理Bも互いに相手の資源解除を待ち続けていて、固まってしまったようになる現象のことである。
トランザクションAは③でテーブルaを更新する。
トランザクションBは④でテーブルbを更新する。
次に、トランザクションAは⑤でテーブルbを更新しようとするが、トランザクションBがテーブルbを更新しているので、テーブルaをロックしたまま待ち状態となる。
その後、トランザクションBがテーブルbを更新終了し、⑥でテーブルbを更新しようとするが、トランザクションAがテーブルaをロックしたままなので、テーブルbをロックしたまま待ち状態となる。
この時点で、トランザクションA、Bともに待ち状態となり、デッドロックとなる。
問7 | 目次 | 問9 |