デッドロック(deadlock)は、複数の処理が 互いに相手の持っている資源の解放を待ち続け、どちらも先へ進めなくなる 状態です。
たとえば会議室と資料を、2人がそれぞれ半分ずつ確保してしまった状況を考えます。
flowchart LR A["処理A:会議室を確保<br/>資料を待つ"] -->|資料が欲しい| B B["処理B:資料を確保<br/>会議室を待つ"] -->|会議室が欲しい| A
AはBの持つ資料を、BはAの持つ会議室を待っていて、どちらも譲らない——この膠着がデッドロックです。トランザクション が同時に走る データベース で起きやすい問題です。
対策には、いくつかの考え方があります。
- 資源を確保する順番をそろえる … みんなが「会議室→資料」の順で取れば、循環が起きない。
- タイムアウトで諦める … 一定時間待っても取れなければ、いったん引く。
- 検出して片方を巻き戻す … データベースがデッドロックを見つけ、一方を強制的にやり直させる。
多くのデータベースは自動でデッドロックを検出し、片方をロールバックして解消します。設計段階で「同時実行」を意識しておくことが、根本的な予防になります。