デッドロック
例
2 つのテーブルを想定
Row A
Row B
2つのトランザクションが同時に以下の順番で行を更新しようとしている
トランザクション T1
1. UPDATE Row A → Row A のロック獲得
2. 次に UPDATE Row B しようとする → しかし Row B は T2 が保持していて待ち状態
トランザクション T2
1. UPDATE Row B → Row B のロック獲得
2. 次に UPDATE Row A しようとする → しかし Row A は T1 が保持していて待ち状態
結果
T1 は、T2 が Row B のロックを解放するのを 待つ
T2 は、T1 が Row A のロックを解放するのを 待つ
どちらも 相手のロックの解放待ちで進めない ため、デッドロックが発生する
デッドロックの解消
どちらか一方をロールバックする
もう片方を進める
etc.
デッドロックを起こすための条件
4つある
相互排他
条件待ち
横取り不可
循環待ち
参考