トランザクション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ともに待ち状態となり、
デッドロックとなる。
EXCEL VBAのご相談なら ファーストマクロ へ
タグ:デッドロック