トランザクションA (処理A1 → 処理A2の順に実行する) とトランザクションB (処理B1 → 処理B2の順に実行する) が、データベースの資源SとTに対し、次のように処理A1 → 処理B1 → 処理A2 → 処理B2 の順で専有ロックを要求する場合、デッドロックが発生する資源の組合せはどれか。
なお、ロックは処理開始時にかけ、トランザクション終了時に解除する。
┌───┐ ┌───┐ ┌───┐
トランザクションA │処理A1│→│処理A2│→│COMMIT│
└───┘ └───┘ └───┘
┌───┐ ┌───┐ ┌───┐
トランザクションB │処理B1│→│処理B2│→│COMMIT│
└───┘ └───┘ └───┘
───────────────────> 時刻
┌─┬─┬─┬─┐
│A1│B1│A2│B2│
┌─┼─┼─┼─┼─┤
│ア│S│S│T│T│
├─┼─┼─┼─┼─┤
│イ│S│T│T│S│
├─┼─┼─┼─┼─┤
│ウ│T│S│T│S│
├─┼─┼─┼─┼─┤
│エ│T│T│S│S│
└─┴─┴─┴─┴─┘
イ
デッドロックは、例えば、今、処理Aが資源Sを使っていて、次に資源Tを使おうとしている一方で、処理Bは資源Tを使っていて、次に資源Sを使おうとしている時、処理Aも処理Bも互いに相手の資源解除を待ち続けていて、固まってしまったようになる現象のことである。
イの場合、
@トランザクションAの処理A1が資源Sを専有ロックする。
AトランザクションBの処理B1が資源Tを専有ロックする。
BトランザクションAの処理A2が資源Tを使おうとするが、処理B1が専有ロックしているので、資源Sを専有ロックしたまま、待ち状態になる。
CトランザクションBの処理B2が資源Sを使おうとするが、資源Sが専有ロックされているため、待ち状態になる。
こうして、互いのトランザクションが待ち状態になり、デッドロック状態となる。
問27 | 目次 | 問29 |