デッドロック(deadlock)
- テクノロジ系
- データベース
- 基本情報
- 応用情報
- 重要度 ★★★★☆
複数の処理が互いの資源解放を待ち続け、永久に処理が進まなくなる状態。
もう少し詳しい説明
デッドロックは、2つの処理が互いに相手を待ってしまい、どちらも永久に進まなくなる状態です。
狭い道で2台の車が鉢合わせして、どちらも譲らない場面を思い浮かべてください。相手が下がってくれれば自分は進めるのに、相手も同じことを考えている。放っておけば、いつまで経っても動きません。
コンピュータの中でも同じことが起きます。処理Aは資源1を押さえたまま資源2が空くのを待ち、処理Bは資源2を押さえたまま資源1が空くのを待つ。どちらも「自分がいま持っているものは離さない」ので、詰みます。
成立する4つの条件
デッドロックが起きるには、次の4つが同時にそろっている必要があります。
- 相互排除 — その資源は同時に1つの処理しか使えない
- 保持と待機 — 何かを持ったまま、別のものを待つ
- 横取り不可 — 持っているものを強制的に取り上げられない
- 循環待ち — 待ち関係が輪になっている
裏を返せば、どれか1つでも崩せば起きません。ここが試験でも実務でも要点になります。
どうやって防ぐか
実際によく使われるのは、4番目の循環待ちを崩す方法です。
資源にあらかじめ番号を振っておき、必ず番号の小さい順にしか取らせないと決めます。こうすると、AもBも同じ順序で取りに行くので、待ち関係が輪になりようがありません。
起きてしまったら
多くのデータベース製品は、デッドロックを検出すると**どちらか一方を強制的に取り消して(ロールバックして)**解消します。狭い道の例なら、誰かが来て「そっちが下がって」と片方に諦めさせるのと同じです。
犠牲になるほうをデッドロック・ビクティムと呼びます。取り消された側はやり直しになりますが、両方が永久に止まり続けるよりはましだ、という判断です。
似ているが違う状態
- 飢餓状態(スタベーション) — 特定の処理だけがいつまでも資源を割り当ててもらえない。待ち関係は輪になっていない
- ライブロック — 状態は変化し続けているのに、実質的に前へ進まない。狭い道で2台が同時に譲り合って、同時に同じ方向へ避け続けるような状態
試験ではこう出る
科目A(旧・午前)の定番用語です。「デッドロックの説明として適切なものはどれか」という定義問題か、2つのトランザクションが資源をロックする順序を示した表を与えて「デッドロックが発生するのはどれか」を選ばせる形が多く出ます。応用情報の科目B(旧・午後)ではデータベース分野で、発生を防ぐ設計をどうするかまで踏み込んで問われます。 表を見るときは、ロックの取得順が互いに逆になっている組合せを探せば解けます。
関連する用語
- 排他制御
- 同時に触られると困るデータに鍵をかける仕組み。この結果として起こる
- ライブロック
- 互いに譲り合って、状態は変わり続けるのに処理が進まない状態
- 飢餓状態(スタベーション)
- 特定の処理だけが資源を得られない状態。ほかの処理は正常に進んでいる
- セマフォ
- 同時に使える数をOSが管理する仕組み
- トランザクション
- これ以上分けられない処理のまとまり
- 2相コミット
- 複数のデータベースにまたがる処理を、全部やるか全部やめるかに揃える手順
ミニクイズ
デッドロックの説明として適切なものはどれか。
正解は 4番:複数の処理が互いの資源解放を待ち続け、処理が進まなくなる状態
ほかの選択肢はそれぞれ、特定の処理だけが割り当てられないのが飢餓状態、状態は変化するのに前へ進まないのがライブロック、一方を待たせる制御そのものが排他制御です。デッドロックは「互いに待つ」ことがポイントで、待ち関係が輪になっているかどうかで見分けます。
最終更新:2026-09-14