デッドロック
Deadlock/でっどろっく
ひとことで言うと
二つの処理が互いに相手のロック解放を待ち合い、どちらも進めなくなる膠着状態のことです。
📖 もうちょい詳しく
何が新しいの?
たくさんの処理を同時に動かすと、同じデータを取り合う場面が出てきます。そこでデータベースは、いじっている最中のデータに「ロック(鍵)」をかけて、ほかの処理が勝手に書き換えないように守ります。ところが、このロックの取り合い方しだいで、お互いが相手を待ったまま止まってしまうことがあります。それがデッドロックです。
どうやって動いてるの?
処理Aがデータ1にロックをかけ、処理Bがデータ2にロックをかけたとします。次にAがデータ2を、Bがデータ1を欲しがると、どちらも相手が鍵を手放すのを待ちます。お互いが待ち続けるので、どちらも先へ進めません。多くのデータベースはこの待ち合いの輪を見つけると、片方の処理を強制的に中断(ロールバック)して、もう片方を通します。
何ができるの?
仕組みを知っておくと、止まったときに「相手を待ち合っている」と原因を見当づけやすくなります。アプリ側では、ロックをかける順番をそろえる、処理を短く区切る、といった工夫で起きにくくできます。完全に防ぐのは難しいので、中断されたら少し待ってやり直す、という備えも合わせて入れておくことが多いです。
🌱 身近なたとえ
せまい一本道で出会った二台の車で例えると、分かりやすいかもしれません。どちらも「相手が先に下がってくれたら進める」と思って動かずにいると、いつまでたっても両方止まったままです。デッドロックもこれと同じで、お互いが相手の道ゆずりを待ち続けて、二つとも進めなくなった状態です。
✅ まず覚えるポイント
- 互いに相手のロック解放を待ち合い、両方が止まる膠着状態です
- ロックは、同時の書き換えからデータを守る「鍵」の仕組みです
- 待ち合いの輪ができると、どちらも先へ進めません
- データベースは検出して、片方を中断することが多いです
- ロックの順番をそろえると、起きにくくできます
🧭 よくある勘違い
デッドロックが起きたら手で直すしかないの?
そうとは限りません。多くのデータベースは待ち合いの輪を自動で見つけて、片方の処理を中断してくれます。中断された側はやり直しになるので、アプリ側で「少し待って再実行する」しくみを入れておくと、人手をかけずに復帰できることが多いです。
ロックさえなければデッドロックは起きないの?
ロックをなくせば取り合いは消えますが、今度は同時の書き換えでデータが壊れる危険が出てきます。ロックはトラブルの原因ではなく、データを守るための仕組みです。問題はロックそのものより、かける順番や持ち続ける時間のほうにあると考えると正確です。
🧩 関連して覚えると楽な言葉
- トランザクション: ひとまとまりの処理。デッドロックは、この処理どうしの待ち合いで起きます
- ACID: トランザクションが守るべき性質。ロックはこれを保つための手段です
- RDB(リレーショナルデータベース): 表でデータを扱う仕組み。ロックの主な舞台です
- スレッド: 同時に走る処理の単位。並行して動くからこそ取り合いが生まれます
🏁 ひとことでまとめ
二つの処理が「相手が鍵を手放すのを待つ」状態で固まり、どちらも動けなくなるのがデッドロックです。順番をそろえる工夫と、止まったらやり直す備えで付き合っていきます。
TERM SEARCH
ほかの用語を調べる
検索ボックスを準備中…