データベースの基礎
トランザクションT1は行Aに専有ロックをかけたあと行Bのロックを要求し、T2は行Bに専有ロックをかけたあと行Aのロックを要求したため、どちらも先へ進めなくなった。DBMSがこの状態を検出したときに行う一般的な対処はどれか。
- Aそのまま待たせ続ける。いずれ一方のロックが自然に解除される
- B一方のトランザクションをロールバックしてロックを解除させ、もう一方を先に進める
- CT1とT2の更新を、両方ともそのままコミットする
答えと解説を見る
正解:B. 一方のトランザクションをロールバックしてロックを解除させ、もう一方を先に進める
2つ以上のトランザクションが、互いに相手の持つロックの解除を待ち合って、どれも先へ進めなくなる状態をデッドロックと呼びます。この状態は待っているだけでは解消しないので、多くのDBMSは、どのトランザクションがどれを待っているかを表す待ちグラフに閉路ができたことなどからデッドロックを検出し、一方(犠牲者)をロールバックしてロックを解除させます。ロールバックされたトランザクションは、あとでやり直します。ロックを待つ時間に上限(タイムアウト)を設けて、超えたらロールバックする方法もあります。予防策としては、すべてのトランザクションが、行Aの次に行Bというように、決まった順番でロックをかけるようにする方法が効果的です。
- A. 互いに相手を待っているので、待っているだけではロックは解除されません。
- B. 正しい。一方をロールバックしてロックを解除させるのが一般的な対処です。
- C. コミットするには必要なロックを得て処理を終える必要があり、待ち合ったままではコミットできません。