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