循環待ち・待機グラフ・予防策を完全理解
2 つ以上のトランザクションが互いに相手のロック解放を待ち合う状態。どちらも先に進めず永遠に待ち続ける膠着状態(循環待ち)。
| 時刻 | トランザクション T1 | トランザクション T2 |
|---|---|---|
| T1 | テーブル A をロック(X) | |
| T2 | テーブル B をロック(X) | |
| T3 | テーブル B を要求 → T2 が保持中のため待機 | |
| T4 | テーブル A を要求 → T1 が保持中のため待機 | |
| T5 | 🔴 デッドロック:両者が永遠に待ち合う | |
DBMS がデッドロックを検出するために使うグラフ。「A が B を待っている」という有向辺を引き、サイクル(循環)が検出されるとデッドロックと判断する。
T1→T2→T3→T1 の循環 = デッドロック確定
| 予防策 | 方法 | 効果 |
|---|---|---|
| ロック順序の固定 | 全トランザクションが同じ順序でロックを取得 | ✅ 最も確実・循環を防ぐ |
| 一括ロック | 必要なロックを全て最初に取得 | ✅ 循環なし・並行性低下 |
| ロックタイムアウト | 一定時間後に自動 ROLLBACK | △ 解決するが発生は防がない |
| 楽観的ロック | ロックを使わずコミット時に確認 | ✅ 競合が少ない場面で有効 |
| トランザクション短縮 | 処理を短くしてロック保持時間を減らす | ✅ 競合窓口を縮小 |
-- NG:T1 は A→B、T2 は B→A の順でロックするとデッドロック -- T1: LOCK A; LOCK B; -- T2: LOCK B; LOCK A; ← 逆順! -- OK:常に「小さい ID のテーブルから」という順序ルールを徹底 -- T1: LOCK A; LOCK B; -- T2: LOCK A; LOCK B; ← 同じ順序!
読了ボタンを押すとトップページの進捗に反映されます