---
title: "デッドロックとは？ロック待ち・排他制御との違い【基本情報技術者試験】"
description: "デッドロックを「複数のトランザクションが互いに相手の資源解放を待ち続ける状態」として整理し、通常のロック待ちや排他制御との違い、発生条件と対策をFE試験向けに解説します。"
last_modified_at: "2026-07-16"
canonical_url: "https://stemtazoo.github.io/fe/deadlock/"
section: "fe"
---

## まず結論

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

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

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

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

## 直感的な説明

2人が、それぞれ別の道具を持っている場面を考えます。

```text
トランザクションA
資源Xをロックしている
資源Yが空くのを待っている

トランザクションB
資源Yをロックしている
資源Xが空くのを待っている
```

AはBの持つ資源Yを待ち、BはAの持つ資源Xを待っています。

しかし、どちらも自分の資源を手放さないため、処理が止まったままになります。これがデッドロックです。

一方で、次のように片方だけが待つ場合は、通常のロック待ちです。

```text
Aが資源Xをロック
Bは資源Xを待つ
Aが処理を終えてロック解除
Bが処理を開始
```

この場合は、いずれBが進めるため、デッドロックではありません。

## 定義・仕組み

### ロックと排他制御

データベースでは、複数のトランザクションが同じデータを同時に更新すると、不整合が起きることがあります。

そのため、あるトランザクションが使用中のデータをロックし、他のトランザクションからのアクセスを制限します。これが排他制御です。

ロックそのものは異常ではありません。問題は、複数のロック待ちが循環することです。

### デッドロックが起きる流れ

例えば、次のような順番で処理したとします。

```text
1. トランザクションAが資源Xをロック
2. トランザクションBが資源Yをロック
3. Aが資源Yを要求して待つ
4. Bが資源Xを要求して待つ
```

AはBを待ち、BはAを待ちます。

```text
A → 資源Y待ち → B
B → 資源X待ち → A
```

このように待ち関係が輪になることを、**循環待ち**と呼びます。

### デッドロックの成立条件

一般に、デッドロックは次の条件が重なったときに発生します。

| 条件 | 意味 |
|---|---|
| 相互排他 | 一つの資源を同時に複数の処理が使えない |
| 保持して待つ | 資源を保持したまま、別の資源を待つ |
| 横取りできない | 他の処理が強制的に資源を奪えない |
| 循環待ち | 複数の処理が輪になって互いを待つ |

FE試験では、四つすべてを暗記するよりも、まず**循環待ちがあるか**を見ると判断しやすくなります。

このテーマは、基本情報技術者試験の「データベース」や「トランザクション処理」と関係する内容です。公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html) から確認できます。

## 科目Aでどう出る？

科目Aでは、デッドロックの説明を選ぶ問題や、通常のロック待ち・排他制御との違いを問う問題として出題されます。

判断するときは、次のキーワードを探します。

- 複数のトランザクション
- それぞれが資源をロックしている
- 相手の資源の解放を待っている
- 待ち状態が循環している
- どの処理も進めない

### 選択肢を切る判断表

| 説明 | 判断 |
|---|---|
| 一方のトランザクションだけがロック解除を待つ | 通常のロック待ち |
| 使用中の資源へ他からアクセスできなくする | 排他制御 |
| 複数のトランザクションが互いの資源を待つ | デッドロック |
| 全処理が完了するまでデータを確定しない | コミット制御に関する説明 |
| 第1相と第2相の間の状態 | 2相コミットに関する説明 |

特に重要なのは、**待っているだけではデッドロックとは限らない**ことです。

```text
一方向の待ち → 処理はいずれ進む
循環した待ち → 誰も進めない
```

## どんな場面で使う？

デッドロックは、複数の処理が同時にデータを更新する場面で問題になります。

例えば、次のような処理です。

- 銀行口座間の振込
- 在庫数と注文情報の同時更新
- 複数テーブルにまたがる更新
- 予約処理と決済処理
- 生産管理システムでの複数設備データ更新

### 対策1：ロックする順番を統一する

全トランザクションが、必ず同じ順番で資源をロックするようにします。

```text
全処理が 資源X → 資源Y の順でロックする
```

順番が統一されていれば、循環待ちが起きにくくなります。

### 対策2：ロック時間を短くする

トランザクションを必要以上に長くしないようにします。

- 不要な処理をトランザクションの外へ出す
- コミットやロールバックを適切に行う
- ユーザー入力を待ちながらロックし続けない

### 対策3：タイムアウトや検出を使う

DBMSがデッドロックを検出した場合、片方のトランザクションをロールバックして、待ち状態を解消することがあります。

これは、すべての処理を成功させるのではなく、**一つを取り消して全体を動かす**考え方です。

## よくある誤解・混同

### ロック待ちはすべてデッドロック

違います。

一方の処理が終われば待っていた処理が進めるなら、通常のロック待ちです。

```text
Aが終了 → Bが進む
```

デッドロックでは、待ち関係が循環しているため、誰も自力で進めません。

### 排他制御はデッドロックそのもの

排他制御は、データの不整合を防ぐための正常な仕組みです。

ただし、複数の排他ロックの取り方が悪いと、デッドロックが発生することがあります。

```text
排他制御 → 必要な仕組み
デッドロック → 排他制御の運用中に起こり得る問題
```

### 一つの資源だけでもデッドロックになる

通常、デッドロックは複数の処理と複数の資源が関係し、待ち関係が循環したときに発生します。

単に一つの資源を複数の処理が待っているだけなら、先に使用中の処理が終われば次へ進めます。

### デッドロックが起きたらDBMS全体を再起動する

必ずしも再起動は必要ありません。

DBMSは、デッドロックを検出して片方のトランザクションをロールバックし、もう片方を進めることがあります。

### 2相コミットと2相ロックを同じものだと思う

名前は似ていますが、目的が異なります。

| 用語 | 目的 |
|---|---|
| 2相コミット | 分散した複数システムでコミットをそろえる |
| 2相ロック | ロックの獲得段階と解放段階を分ける |
| デッドロック | 互いの資源を待って処理が進まない状態 |

## 確認問題（基本情報技術者試験対策）

トランザクションPは表Aをロックした後、表Bのロック解除を待っている。トランザクションQは表Bをロックした後、表Aのロック解除を待っている。この状態の説明として最も適切なものはどれか。

- ア. 排他制御が行われていない
- イ. 通常の一方向のロック待ちである
- ウ. 複数のトランザクションによるデッドロックである
- エ. すべての更新処理が正常にコミットされた状態である

<details markdown="1">
<summary>▶ クリックして答えと解説を見る（ここを開く）</summary>

**正解：ウ**

- PはQが保持する表Bを待っています。
- QはPが保持する表Aを待っています。
- 待ち関係が循環しているため、どちらも先へ進めません。
- これはデッドロックです。

</details>

## まとめ（試験直前用）

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