---
title: "2相コミットとは？分散データベースで更新をそろえる仕組み【基本情報技術者試験】"
description: "2相コミットを、複数サイトに更新可能かを確認し、全員が同意した場合だけ一斉に確定する方式として整理し、調停者・参加者、第1相・第2相、排他制御・ロールバック・ロールフォワードとの違いをFE試験向けに解説します。"
last_modified_at: "2026-07-15"
canonical_url: "https://stemtazoo.github.io/fe/two-phase-commit/"
section: "fe"
---

## まず結論

2相コミットとは、**分散データベースで、複数サイトの更新を「全員で確定」または「全員で中止」にそろえる仕組み**です。

基本情報技術者試験では、次の表現が決め手になります。

```text
複数サイトへ更新可能か問い合わせる
＋
すべてのサイトが可能なら確定する
→ 2相コミット
```

いきなり更新を確定せず、まず全参加者へ確認し、その後に全体を確定または中止する点が重要です。

## 直感的な説明

2相コミットは、**全員に準備できたか確認してから、一斉に実行する仕組み**と考えると分かりやすいです。

例えば、複数の支店で同じ取引に関するデータを更新するとします。

```text
支店A：更新成功
支店B：更新失敗
```

このように一部だけ更新されると、データのつじつまが合わなくなります。

そこで、最初に全支店へ確認します。

```text
調停者：
「全員、更新を確定できる状態ですか？」
```

全員が「できます」と答えた場合だけ、確定を指示します。

```text
全員が可
→ 全員コミット
```

1つでも「できません」があれば、全体を中止します。

```text
1つでも不可
→ 全員ロールバック
```

## 定義・仕組み

2相コミットでは、中心となる**調停者**と、更新に参加する**参加者**が登場します。

| 役割 | すること |
|---|---|
| 調停者 | 各参加者へ可否を問い合わせ、最終指示を出す |
| 参加者 | 更新を確定できるか回答し、最終指示に従う |

処理は2段階に分かれます。

### 第1相：準備・確認

調停者が、各参加者にコミット可能か問い合わせます。

参加者は、更新を確定できる状態なら「可」、できない場合は「不可」と回答します。

この段階では、まだ最終確定しません。

```text
調停者
→ 参加者A：コミット可能？
→ 参加者B：コミット可能？
→ 参加者C：コミット可能？
```

### 第2相：確定・中止

すべての参加者が「可」なら、調停者は全員へコミットを指示します。

```text
A：可
B：可
C：可
→ 全員コミット
```

1つでも「不可」がある場合は、全員へロールバックを指示します。

```text
A：可
B：不可
C：可
→ 全員ロールバック
```

2相コミットは、この仕組みによって、分散環境でもトランザクションの原子性を保とうとします。

```text
全サイト更新
または
全サイト未更新
```

のどちらかにそろえます。

公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html)から確認できます。

## 科目Aでどう出る？

科目Aでは、問題文の表現から方式を選ばせる問題が中心です。

| 問題文の表現 | 選ぶ用語 |
|---|---|
| 複数サイトに更新可能か問い合わせる | 2相コミット |
| 全参加者の合意後に一斉に確定する | 2相コミット |
| 同じデータへの同時アクセスを制限する | 排他制御 |
| 未確定の更新を処理前へ戻す | ロールバック |
| ログを使って更新を再実行し復旧する | ロールフォワード |

試験では、次の3つを見つけます。

```text
複数サイト
全参加者へ確認
全員可なら確定
```

この3つがそろえば、2相コミットを疑います。

### 調停者と参加者を読み分ける

```text
問い合わせる側
→ 調停者

可否を回答する側
→ 参加者
```

調停者は、全参加者から「可」を受け取ったときだけコミットを指示します。

### 第1相と第2相を読み分ける

```text
第1相
→ コミット可能か確認する

第2相
→ コミットまたはロールバックを指示する
```

「確認」と「確定」を混同しないことがポイントです。

## どんな場面で使う？

2相コミットは、1つのトランザクションが複数のデータベースやサイトにまたがる場合に使います。

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

```text
拠点Aの在庫を減らす
＋
拠点Bの配送情報を登録する
＋
本部の売上を記録する
```

一部だけ成功すると不整合が起こるため、全体の結果をそろえる必要があります。

ただし、複数サイトとの通信や応答待ちが必要になるため、単一サイトの通常のコミットより処理は複雑になります。

## よくある誤解・混同

### 2相コミットと排他制御

| 用語 | 目的 |
|---|---|
| 2相コミット | 複数サイトの更新結果をそろえる |
| 排他制御 | 同じデータへの同時アクセスを制御する |

```text
全員の合意を取る
→ 2相コミット

他の処理を待たせる
→ 排他制御
```

### 2相コミットとロールバック

ロールバックは、処理を取り消して開始前の状態へ戻す操作です。

2相コミットでは、1つでも「不可」があればロールバックを指示しますが、2相コミットそのものは**全参加者へ確認して、全体の最終結果を決める方式**です。

```text
更新前ログで元に戻す
→ ロールバック

複数サイトへ可否を確認する
→ 2相コミット
```

### 2相コミットとロールフォワード

ロールフォワードは、更新後ログを使って、バックアップ取得後の更新を再実行する復旧方法です。

| 用語 | 向き |
|---|---|
| ロールバック | 更新を取り消して戻す |
| ロールフォワード | ログで更新を進めて復旧する |
| 2相コミット | 複数サイトの確定・中止をそろえる |

### 2相コミットと通常のコミット

```text
通常のコミット
→ 1つのトランザクション結果を確定する

2相コミット
→ 複数サイトの合意を確認して全体を確定する
```

「コミット」という名前だけで判断せず、複数サイトと可否確認があるかを見ます。

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

- 2相コミットは、分散DBで複数サイトの更新結果をそろえる方式
- 第1相でコミット可能か確認する
- 第2相でコミットまたはロールバックを指示する
- 全参加者が可ならコミット、1つでも不可ならロールバック
- 同時アクセスの制御は排他制御
- 更新取消しはロールバック、ログによる再実行はロールフォワード
