---
title: "コミットとロールバックとは？トランザクションを確定・取消する基本【基本情報技術者試験】"
description: "コミットを「トランザクションの結果を確定する操作」、ロールバックを「異常終了時に処理前へ戻す操作」として整理し、DELETE、デッドロック、ACID特性、ロールフォワードとの違いをFE試験向けに解説します。"
last_modified_at: "2026-07-15"
canonical_url: "https://stemtazoo.github.io/fe/commit-rollback/"
section: "fe"
---

## まず結論

コミットとは、**トランザクションの処理結果を確定する操作**です。

ロールバックとは、**途中で失敗した処理を取り消し、トランザクション開始前の状態に戻す操作**です。

基本情報技術者試験では、次のように切り分けます。

| 用語 | 意味 | 判断の合図 |
|---|---|---|
| コミット | 処理結果を確定する | 正常終了、確定、反映 |
| ロールバック | 未確定の処理を取り消す | 異常終了、取消し、処理前へ戻す |

特に重要なのは、**SQLを実行したかではなく、コミットされたかを見る**ことです。

```text
全部成功した
→ COMMIT

途中で失敗した
→ ROLLBACK
```

## 直感的な説明

ネットショップの注文処理を考えます。

```text
1. 在庫数を減らす
2. 注文履歴を追加する
3. 請求情報を登録する
```

3つすべてが成功したら、コミットして結果を確定します。

一方、請求情報の登録で失敗したのに、在庫だけ減った状態を残すと困ります。

そこで、在庫数や注文履歴の変更も含めて取り消し、処理前へ戻します。これがロールバックです。

```text
コミット
→ これで確定

ロールバック
→ なかったことに戻す
```

## 定義・仕組み

トランザクションとは、データベースに対する一連の処理を、ひとまとまりとして扱う単位です。

例えば銀行振込では、出金と入金をまとめて扱います。

```text
トランザクション開始
  Aさんの残高を減らす
  Bさんの残高を増やす
コミット
```

途中で問題が起きた場合は、ロールバックして両方の更新を取り消します。

```text
トランザクション開始
  Aさんの残高を減らす
  Bさんの残高を増やす途中で失敗
ロールバック
```

この仕組みにより、中途半端な状態が残ることを防ぎます。

| 操作 | 何をする？ | 関係が深いACID特性 |
|---|---|---|
| コミット | 更新結果を確定する | 永続性 |
| ロールバック | 処理前へ戻す | 原子性 |

ロールバックは、**全部実行するか、全部実行しないか**という原子性を支える操作です。

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

## 科目Aでどう出る？

科目Aでは、コミット・ロールバック・原子性の意味だけでなく、**異常終了後に表がどうなるか**を問われます。

判断の手順は次のとおりです。

```text
1. どのSQLが実行されたか確認する
2. 正常終了か異常終了か確認する
3. コミットされたか確認する
4. 未確定ならロールバック後の状態を選ぶ
```

### DELETE後に異常終了した場合

例えば、次のSQLを実行したとします。

```sql
DELETE FROM 商品
WHERE 商品コード = 'B020';
```

正常終了してコミットされれば、`B020` の行は削除されます。

しかし、デッドロックなどでトランザクションが異常終了した場合、削除はロールバックされます。

```text
DELETEを実行
↓
B020を削除しようとする
↓
デッドロックで異常終了
↓
ロールバック
↓
B020の行は元に戻る
```

ここで注意したいのは、`DELETE` は列の値を `NULL` にする命令ではないことです。

```text
行全体を削除する
→ DELETE

列の値をNULLにする
→ UPDATE ... SET 列名 = NULL
```

### デッドロックが起きた場合

デッドロックは、複数のトランザクションが互いに相手のロック解除を待ち、処理を進められなくなる状態です。

```text
トランザクションA
→ データ1をロック
→ データ2の解除待ち

トランザクションB
→ データ2をロック
→ データ1の解除待ち
```

DBMSは通常、どちらかのトランザクションを中止してデッドロックを解消します。中止された側の未確定の更新はロールバックされます。

試験では、**デッドロックが起きたら、異常終了した側の更新は残らない**と判断します。

## どんな場面で使う？

コミットとロールバックは、複数の更新をまとめて整合性を保ちたい処理で使います。

- 銀行振込
- 商品注文
- 在庫更新
- 会員登録
- 複数表を同時に更新する処理

例えば、注文処理では、在庫更新だけ成功して注文履歴の登録に失敗する状態を避ける必要があります。

```text
すべて成功
→ コミット

どこかで失敗
→ ロールバック
```

## よくある誤解・混同

### 誤解1：SQLを実行した時点で更新は確定している

SQLを実行しても、コミット前なら未確定です。

```text
更新した
でもコミットしていない
→ まだ確定ではない
```

試験では、**コミットされたかどうか**を確認します。

### 誤解2：ロールバックは最後の1処理だけを取り消す

基本的には、対象トランザクション内の未確定処理をまとめて取り消します。

```text
処理A
処理B
処理Cで失敗
→ AとBも含めて取り消す
```

### 誤解3：DELETEすると列の値がNULLになる

`DELETE` は条件に合う行全体を削除します。

列の値だけを変更するのは `UPDATE` です。

### 誤解4：ロールバックとロールフォワードは同じ

| 用語 | 役割 |
|---|---|
| コミット | 更新結果を確定する |
| ロールバック | 未確定の更新を取り消す |
| ロールフォワード | ログを使って確定済み更新を再実行する |

```text
ロールバック
→ 戻す

ロールフォワード
→ 進めて復旧する
```

### 誤解5：デッドロックでも途中の更新は残る

デッドロックで中止されたトランザクションの未確定更新は、通常ロールバックされます。

```text
異常終了
→ 未確定更新は確定しない
→ 処理前へ戻る
```

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

- コミットは、トランザクションの処理結果を確定する操作
- ロールバックは、異常終了時に未確定の更新を処理前へ戻す操作
- SQLを実行したかではなく、コミットされたかを見る
- `DELETE` は行全体を削除し、`UPDATE ... SET NULL` とは異なる
- デッドロックで中止された側の未確定更新はロールバックされる
- ロールバックは原子性、コミット後の保持は永続性と関係が深い
- ロールフォワードは、確定済み更新をログから再実行する復旧処理
