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