Skip to the content.

最終更新日:2026年7月16日

まず結論

デッドロックとは、複数のトランザクションが、互いに相手のロックしている資源の解放を待ち続け、どの処理も先へ進めなくなる状態です。

基本情報技術者試験では、次の切り分けが重要です。

  • 一方だけが待つ → 通常のロック待ち
  • 他の処理を一時的に止める → 排他制御
  • お互いに相手を待つ → デッドロック

覚え方は、「お互い待ちで、誰も進めない」です。

直感的な説明

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を待っています。
  • 待ち関係が循環しているため、どちらも先へ進めません。
  • これはデッドロックです。

まとめ(試験直前用)

  • デッドロックは、複数の処理が互いの資源解放を待ち続ける状態
  • 一方だけが待つなら、通常のロック待ち
  • 他からのアクセスを制限する仕組みは排他制御
  • 待ち関係が循環しているかを確認する
  • 対策は、ロック順序の統一、ロック時間の短縮、検出後のロールバック

© 2024-2026 stemtazoo. All rights reserved.