最終更新日:2026年7月16日
fe fe-technology database
まず結論
デッドロックとは、複数のトランザクションが、互いに相手のロックしている資源の解放を待ち続け、どの処理も先へ進めなくなる状態です。
基本情報技術者試験では、次の切り分けが重要です。
- 一方だけが待つ → 通常のロック待ち
- 他の処理を一時的に止める → 排他制御
- お互いに相手を待つ → デッドロック
覚え方は、「お互い待ちで、誰も進めない」です。
直感的な説明
2人が、それぞれ別の道具を持っている場面を考えます。
トランザクションA
資源Xをロックしている
資源Yが空くのを待っている
トランザクションB
資源Yをロックしている
資源Xが空くのを待っている
AはBの持つ資源Yを待ち、BはAの持つ資源Xを待っています。
しかし、どちらも自分の資源を手放さないため、処理が止まったままになります。これがデッドロックです。
一方で、次のように片方だけが待つ場合は、通常のロック待ちです。
Aが資源Xをロック
Bは資源Xを待つ
Aが処理を終えてロック解除
Bが処理を開始
この場合は、いずれBが進めるため、デッドロックではありません。
定義・仕組み
ロックと排他制御
データベースでは、複数のトランザクションが同じデータを同時に更新すると、不整合が起きることがあります。
そのため、あるトランザクションが使用中のデータをロックし、他のトランザクションからのアクセスを制限します。これが排他制御です。
ロックそのものは異常ではありません。問題は、複数のロック待ちが循環することです。
デッドロックが起きる流れ
例えば、次のような順番で処理したとします。
1. トランザクションAが資源Xをロック
2. トランザクションBが資源Yをロック
3. Aが資源Yを要求して待つ
4. Bが資源Xを要求して待つ
AはBを待ち、BはAを待ちます。
A → 資源Y待ち → B
B → 資源X待ち → A
このように待ち関係が輪になることを、循環待ちと呼びます。
デッドロックの成立条件
一般に、デッドロックは次の条件が重なったときに発生します。
| 条件 | 意味 |
|---|---|
| 相互排他 | 一つの資源を同時に複数の処理が使えない |
| 保持して待つ | 資源を保持したまま、別の資源を待つ |
| 横取りできない | 他の処理が強制的に資源を奪えない |
| 循環待ち | 複数の処理が輪になって互いを待つ |
FE試験では、四つすべてを暗記するよりも、まず循環待ちがあるかを見ると判断しやすくなります。
このテーマは、基本情報技術者試験の「データベース」や「トランザクション処理」と関係する内容です。公式の出題範囲やシラバスは、IPA:基本情報技術者試験 から確認できます。
科目Aでどう出る?
科目Aでは、デッドロックの説明を選ぶ問題や、通常のロック待ち・排他制御との違いを問う問題として出題されます。
判断するときは、次のキーワードを探します。
- 複数のトランザクション
- それぞれが資源をロックしている
- 相手の資源の解放を待っている
- 待ち状態が循環している
- どの処理も進めない
選択肢を切る判断表
| 説明 | 判断 |
|---|---|
| 一方のトランザクションだけがロック解除を待つ | 通常のロック待ち |
| 使用中の資源へ他からアクセスできなくする | 排他制御 |
| 複数のトランザクションが互いの資源を待つ | デッドロック |
| 全処理が完了するまでデータを確定しない | コミット制御に関する説明 |
| 第1相と第2相の間の状態 | 2相コミットに関する説明 |
特に重要なのは、待っているだけではデッドロックとは限らないことです。
一方向の待ち → 処理はいずれ進む
循環した待ち → 誰も進めない
どんな場面で使う?
デッドロックは、複数の処理が同時にデータを更新する場面で問題になります。
例えば、次のような処理です。
- 銀行口座間の振込
- 在庫数と注文情報の同時更新
- 複数テーブルにまたがる更新
- 予約処理と決済処理
- 生産管理システムでの複数設備データ更新
対策1:ロックする順番を統一する
全トランザクションが、必ず同じ順番で資源をロックするようにします。
全処理が 資源X → 資源Y の順でロックする
順番が統一されていれば、循環待ちが起きにくくなります。
対策2:ロック時間を短くする
トランザクションを必要以上に長くしないようにします。
- 不要な処理をトランザクションの外へ出す
- コミットやロールバックを適切に行う
- ユーザー入力を待ちながらロックし続けない
対策3:タイムアウトや検出を使う
DBMSがデッドロックを検出した場合、片方のトランザクションをロールバックして、待ち状態を解消することがあります。
これは、すべての処理を成功させるのではなく、一つを取り消して全体を動かす考え方です。
よくある誤解・混同
ロック待ちはすべてデッドロック
違います。
一方の処理が終われば待っていた処理が進めるなら、通常のロック待ちです。
Aが終了 → Bが進む
デッドロックでは、待ち関係が循環しているため、誰も自力で進めません。
排他制御はデッドロックそのもの
排他制御は、データの不整合を防ぐための正常な仕組みです。
ただし、複数の排他ロックの取り方が悪いと、デッドロックが発生することがあります。
排他制御 → 必要な仕組み
デッドロック → 排他制御の運用中に起こり得る問題
一つの資源だけでもデッドロックになる
通常、デッドロックは複数の処理と複数の資源が関係し、待ち関係が循環したときに発生します。
単に一つの資源を複数の処理が待っているだけなら、先に使用中の処理が終われば次へ進めます。
デッドロックが起きたらDBMS全体を再起動する
必ずしも再起動は必要ありません。
DBMSは、デッドロックを検出して片方のトランザクションをロールバックし、もう片方を進めることがあります。
2相コミットと2相ロックを同じものだと思う
名前は似ていますが、目的が異なります。
| 用語 | 目的 |
|---|---|
| 2相コミット | 分散した複数システムでコミットをそろえる |
| 2相ロック | ロックの獲得段階と解放段階を分ける |
| デッドロック | 互いの資源を待って処理が進まない状態 |
確認問題(基本情報技術者試験対策)
トランザクションPは表Aをロックした後、表Bのロック解除を待っている。トランザクションQは表Bをロックした後、表Aのロック解除を待っている。この状態の説明として最も適切なものはどれか。
- ア. 排他制御が行われていない
- イ. 通常の一方向のロック待ちである
- ウ. 複数のトランザクションによるデッドロックである
- エ. すべての更新処理が正常にコミットされた状態である
▶ クリックして答えと解説を見る(ここを開く)
正解:ウ
- PはQが保持する表Bを待っています。
- QはPが保持する表Aを待っています。
- 待ち関係が循環しているため、どちらも先へ進めません。
- これはデッドロックです。
まとめ(試験直前用)
- デッドロックは、複数の処理が互いの資源解放を待ち続ける状態
- 一方だけが待つなら、通常のロック待ち
- 他からのアクセスを制限する仕組みは排他制御
- 待ち関係が循環しているかを確認する
- 対策は、ロック順序の統一、ロック時間の短縮、検出後のロールバック