---
title: "トランザクションの原子性とは？COMMIT・ROLLBACKとデッドロック【基本情報技術者試験】"
description: "データベースのトランザクションを、原子性、COMMIT、ROLLBACK、デッドロックとの関係から初心者向けに整理します。異常終了後の表の状態を判断する手順を、基本情報技術者試験の選択肢の切り方とあわせて解説します。"
last_modified_at: "2026-08-01"
canonical_url: "https://stemtazoo.github.io/fe/transaction-atomicity-rollback/"
section: "fe"
---

## まず結論

**トランザクション**は、複数のデータベース処理をひとまとまりとして扱う単位です。

試験では、次の判断軸が重要です。

```text
正常終了してCOMMIT
→ 更新を確定

異常終了
→ ROLLBACK

ROLLBACK
→ トランザクション開始前へ戻る

全部成功か全部取り消し
→ 原子性
```

SQL文だけを見て結果を決めず、**正常終了したか、異常終了したか**まで確認します。

## 直感的な説明

銀行振込を考えると分かりやすいです。

```text
Aさんの残高を1万円減らす
＋
Bさんの残高を1万円増やす
```

この二つの処理は、両方成功しなければいけません。

片方だけ成功すると、お金が消えたり、逆に増えたりしてしまいます。

そこで、データベースでは次のどちらかにします。

```text
すべて成功
→ 更新を確定

途中で失敗
→ すべて取り消す
```

この「全部か、何もなしか」という考え方が、トランザクションの原子性です。

## 定義・仕組み

### トランザクションとは

トランザクションは、データベースに対する一連の処理をまとめたものです。

例えば、商品の価格変更では、次のような流れがあります。

```text
対象の商品を検索
↓
価格を更新
↓
更新結果を確定
```

この一連の処理を一つの単位として扱います。

### 原子性とは

原子性は、ACID特性の一つです。

> トランザクション内の処理を、すべて実行するか、まったく実行しないかのどちらかにする性質

英語では **Atomicity** といいます。

```text
全部成功
→ COMMIT

途中で失敗
→ ROLLBACK
```

異常終了した途中結果を残さないことで、データの不整合を防ぎます。

### COMMIT

COMMITは、トランザクション内の更新を正式に確定する処理です。

```text
UPDATEやDELETEを実行
↓
COMMIT
↓
更新内容が確定
```

COMMIT後は、その更新を通常のROLLBACKで元へ戻すことはできません。

### ROLLBACK

ROLLBACKは、確定前の更新を取り消し、トランザクション開始前の状態へ戻す処理です。

```text
DELETEを実行
↓
障害や異常終了
↓
ROLLBACK
↓
削除前の状態へ戻る
```

試験では、次の言葉があればROLLBACKを疑います。

```text
異常終了
障害発生
デッドロック
処理失敗
```

### DELETE文とROLLBACK

例えば、次のSQLを考えます。

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

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

しかし、デッドロックなどでトランザクションが異常終了すると、削除処理はROLLBACKされます。

```text
B020を削除する予定
↓
異常終了
↓
削除を取り消す
↓
B020は残る
```

### デッドロックとは

デッドロックは、複数のトランザクションが互いに相手のロック解除を待ち続ける状態です。

```text
トランザクションA
→ 商品表をロック
→ 在庫表の解放を待つ

トランザクションB
→ 在庫表をロック
→ 商品表の解放を待つ
```

この状態では、どちらも処理を続けられません。

DBMSは通常、どちらか一方のトランザクションを異常終了させて、デッドロックを解消します。

異常終了した側の更新はROLLBACKされます。

### 更新前ログとの関係

DBMSは、更新前の値をログに記録しておきます。

```text
更新前の値をログへ保存
↓
更新処理を実行
↓
異常終了
↓
ログを使って元へ戻す
```

この仕組みによって、原子性を保ちます。

## どんな場面で使う？

### 銀行振込

複数の口座更新を一つのトランザクションとして扱います。

```text
送金元を減額
＋
送金先を増額
```

どちらか片方だけ成功することを防ぎます。

### 在庫と注文の同時更新

注文を登録するとき、在庫数も減らす必要があります。

```text
注文を登録
＋
在庫を減らす
```

途中で失敗した場合は、両方とも取り消します。

### 複数表の更新

顧客情報と契約情報など、複数の表を同時に更新する処理で使います。

```text
顧客表を更新
＋
契約表を更新
```

片方だけ更新されるとデータが矛盾するため、トランザクションとしてまとめます。

### SQL実行結果を問う問題

基本情報技術者試験では、SQL文だけでなく、トランザクションの終了状態を含めて最終結果を判断させる問題が出ます。

```text
SQL文の意味
＋
COMMITかROLLBACKか
→ 最終的な表の状態
```

## よくある誤解・混同

### DELETE文を見たら、すぐに行が消える？

DELETE文を実行しただけでは、最終結果は決まりません。

```text
DELETE実行
→ 削除予定

COMMIT
→ 削除を確定

ROLLBACK
→ 削除を取り消す
```

問題文に「異常終了」とあれば、削除前へ戻る可能性があります。

### DELETEとNULLを混同する

DELETEは行そのものを削除します。

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

一方、列の値をNULLにする場合はUPDATEを使います。

```sql
UPDATE 商品
SET 商品名 = NULL
WHERE 商品コード = 'B020';
```

```text
DELETE
→ 行を削除

NULL
→ 行は残るが値がない
```

### 異常終了しても、途中までの更新は残る？

原子性が保証されるトランザクションでは、途中までの更新は残しません。

```text
一部だけ成功
→ 認めない

すべて取り消す
→ ROLLBACK
```

### デッドロックは参照だけなら影響しない？

他のトランザクションが参照だけでも、自分のトランザクションがデッドロックで異常終了すれば、その更新はROLLBACKされます。

見るべきなのは、他のトランザクションの更新有無ではなく、**対象トランザクションが正常終了したか**です。

### COMMITとROLLBACKはどちらも終了処理？

どちらもトランザクションを終わらせますが、結果が違います。

```text
COMMIT
→ 更新を残す

ROLLBACK
→ 更新を取り消す
```

### 原子性と一貫性を混同する

原子性は、全部実行するか全部取り消すかです。

一貫性は、トランザクションの前後でデータの整合性を保つことです。

```text
全部か何もなしか
→ 原子性

ルール違反のデータにしない
→ 一貫性
```

### ACID特性の整理

| 特性 | 意味 | 判断キーワード |
|---|---|---|
| 原子性 | 全部実行か全部取り消し | COMMIT・ROLLBACK |
| 一貫性 | データの整合性を維持 | 制約・矛盾を防ぐ |
| 独立性 | 同時処理が互いに不当に影響しない | 排他制御・ロック |
| 永続性 | 確定した更新を失わない | COMMIT後・障害後も保持 |

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

```text
正常終了してCOMMIT
→ 更新を確定

異常終了
→ ROLLBACK

ROLLBACK
→ トランザクション開始前へ戻る

全部成功か全部取り消し
→ 原子性
```

SQLの結果を問われたら、次の順で確認します。

1. SQL文が何をするか確認する
2. WHERE句に一致する行を確認する
3. 正常終了か異常終了か確認する
4. COMMITかROLLBACKか判断する
5. 最終的な表の状態を選ぶ

判断表にすると次のとおりです。

| 状況 | 最終結果 |
|---|---|
| DELETE後にCOMMIT | 対象行を削除 |
| UPDATE後にCOMMIT | 変更値を確定 |
| 異常終了 | 更新を取り消す |
| デッドロックで中断 | ROLLBACKして元へ戻る |

一言で覚えるなら、

> **異常終了した更新は、ROLLBACKでなかったことになる。**
