最終更新日:2026年8月1日
fe fe-technology database transaction
まず結論
トランザクションは、複数のデータベース処理をひとまとまりとして扱う単位です。
試験では、次の判断軸が重要です。
正常終了してCOMMIT
→ 更新を確定
異常終了
→ ROLLBACK
ROLLBACK
→ トランザクション開始前へ戻る
全部成功か全部取り消し
→ 原子性
SQL文だけを見て結果を決めず、正常終了したか、異常終了したかまで確認します。
直感的な説明
銀行振込を考えると分かりやすいです。
Aさんの残高を1万円減らす
+
Bさんの残高を1万円増やす
この二つの処理は、両方成功しなければいけません。
片方だけ成功すると、お金が消えたり、逆に増えたりしてしまいます。
そこで、データベースでは次のどちらかにします。
すべて成功
→ 更新を確定
途中で失敗
→ すべて取り消す
この「全部か、何もなしか」という考え方が、トランザクションの原子性です。
定義・仕組み
トランザクションとは
トランザクションは、データベースに対する一連の処理をまとめたものです。
例えば、商品の価格変更では、次のような流れがあります。
対象の商品を検索
↓
価格を更新
↓
更新結果を確定
この一連の処理を一つの単位として扱います。
原子性とは
原子性は、ACID特性の一つです。
トランザクション内の処理を、すべて実行するか、まったく実行しないかのどちらかにする性質
英語では Atomicity といいます。
全部成功
→ COMMIT
途中で失敗
→ ROLLBACK
異常終了した途中結果を残さないことで、データの不整合を防ぎます。
COMMIT
COMMITは、トランザクション内の更新を正式に確定する処理です。
UPDATEやDELETEを実行
↓
COMMIT
↓
更新内容が確定
COMMIT後は、その更新を通常のROLLBACKで元へ戻すことはできません。
ROLLBACK
ROLLBACKは、確定前の更新を取り消し、トランザクション開始前の状態へ戻す処理です。
DELETEを実行
↓
障害や異常終了
↓
ROLLBACK
↓
削除前の状態へ戻る
試験では、次の言葉があればROLLBACKを疑います。
異常終了
障害発生
デッドロック
処理失敗
DELETE文とROLLBACK
例えば、次のSQLを考えます。
DELETE FROM 商品
WHERE 商品コード = 'B020';
正常終了してCOMMITされれば、B020の行は削除されます。
しかし、デッドロックなどでトランザクションが異常終了すると、削除処理はROLLBACKされます。
B020を削除する予定
↓
異常終了
↓
削除を取り消す
↓
B020は残る
デッドロックとは
デッドロックは、複数のトランザクションが互いに相手のロック解除を待ち続ける状態です。
トランザクションA
→ 商品表をロック
→ 在庫表の解放を待つ
トランザクションB
→ 在庫表をロック
→ 商品表の解放を待つ
この状態では、どちらも処理を続けられません。
DBMSは通常、どちらか一方のトランザクションを異常終了させて、デッドロックを解消します。
異常終了した側の更新はROLLBACKされます。
更新前ログとの関係
DBMSは、更新前の値をログに記録しておきます。
更新前の値をログへ保存
↓
更新処理を実行
↓
異常終了
↓
ログを使って元へ戻す
この仕組みによって、原子性を保ちます。
どんな場面で使う?
銀行振込
複数の口座更新を一つのトランザクションとして扱います。
送金元を減額
+
送金先を増額
どちらか片方だけ成功することを防ぎます。
在庫と注文の同時更新
注文を登録するとき、在庫数も減らす必要があります。
注文を登録
+
在庫を減らす
途中で失敗した場合は、両方とも取り消します。
複数表の更新
顧客情報と契約情報など、複数の表を同時に更新する処理で使います。
顧客表を更新
+
契約表を更新
片方だけ更新されるとデータが矛盾するため、トランザクションとしてまとめます。
SQL実行結果を問う問題
基本情報技術者試験では、SQL文だけでなく、トランザクションの終了状態を含めて最終結果を判断させる問題が出ます。
SQL文の意味
+
COMMITかROLLBACKか
→ 最終的な表の状態
よくある誤解・混同
DELETE文を見たら、すぐに行が消える?
DELETE文を実行しただけでは、最終結果は決まりません。
DELETE実行
→ 削除予定
COMMIT
→ 削除を確定
ROLLBACK
→ 削除を取り消す
問題文に「異常終了」とあれば、削除前へ戻る可能性があります。
DELETEとNULLを混同する
DELETEは行そのものを削除します。
DELETE FROM 商品
WHERE 商品コード = 'B020';
一方、列の値をNULLにする場合はUPDATEを使います。
UPDATE 商品
SET 商品名 = NULL
WHERE 商品コード = 'B020';
DELETE
→ 行を削除
NULL
→ 行は残るが値がない
異常終了しても、途中までの更新は残る?
原子性が保証されるトランザクションでは、途中までの更新は残しません。
一部だけ成功
→ 認めない
すべて取り消す
→ ROLLBACK
デッドロックは参照だけなら影響しない?
他のトランザクションが参照だけでも、自分のトランザクションがデッドロックで異常終了すれば、その更新はROLLBACKされます。
見るべきなのは、他のトランザクションの更新有無ではなく、対象トランザクションが正常終了したかです。
COMMITとROLLBACKはどちらも終了処理?
どちらもトランザクションを終わらせますが、結果が違います。
COMMIT
→ 更新を残す
ROLLBACK
→ 更新を取り消す
原子性と一貫性を混同する
原子性は、全部実行するか全部取り消すかです。
一貫性は、トランザクションの前後でデータの整合性を保つことです。
全部か何もなしか
→ 原子性
ルール違反のデータにしない
→ 一貫性
ACID特性の整理
| 特性 | 意味 | 判断キーワード |
|---|---|---|
| 原子性 | 全部実行か全部取り消し | COMMIT・ROLLBACK |
| 一貫性 | データの整合性を維持 | 制約・矛盾を防ぐ |
| 独立性 | 同時処理が互いに不当に影響しない | 排他制御・ロック |
| 永続性 | 確定した更新を失わない | COMMIT後・障害後も保持 |
まとめ(試験直前用)
正常終了してCOMMIT
→ 更新を確定
異常終了
→ ROLLBACK
ROLLBACK
→ トランザクション開始前へ戻る
全部成功か全部取り消し
→ 原子性
SQLの結果を問われたら、次の順で確認します。
- SQL文が何をするか確認する
- WHERE句に一致する行を確認する
- 正常終了か異常終了か確認する
- COMMITかROLLBACKか判断する
- 最終的な表の状態を選ぶ
判断表にすると次のとおりです。
| 状況 | 最終結果 |
|---|---|
| DELETE後にCOMMIT | 対象行を削除 |
| UPDATE後にCOMMIT | 変更値を確定 |
| 異常終了 | 更新を取り消す |
| デッドロックで中断 | ROLLBACKして元へ戻る |
一言で覚えるなら、
異常終了した更新は、ROLLBACKでなかったことになる。