情報処理試験を勉強していると、「コミットって結局何をするもの?ロールバックとどう違うの?」と混乱しがちです。この記事では、データベースにおけるコミット(Commit)の意味を日常の例え話で噛み砕き、試験で得点できるレベルまで整理します。
対象試験と出題頻度
コミットは、ITパスポート・基本情報技術者・応用情報技術者で出題されるテーマです。
DBMSのトランザクション管理に関する問題で定番化しており、ロールバックや排他制御の説明文との区別が問われます。
詳細をクリックして確認
ITパスポート
基本情報技術者
応用情報技術者
★★★★☆
ランクA(重要)必ず覚えておくべき
用語の定義
コミット(Commit)とは、一言で言うと
「トランザクションの処理結果をデータベースに確定させる操作」
のことです。
イメージとしては、「書類への押印」です。
契約書は、下書きの段階ではまだ正式な効力を持ちません。
双方が内容を確認し、問題なければ押印して初めて「確定」になります。コミットもこれと同じで、一連のデータ操作がすべて正常に終わったタイミングで「この変更を正式に反映してよし」と確定させる行為です。
逆に問題が見つかれば押印せずに破棄する。これがロールバックに相当します。
📊 コミットの基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Commit |
| 分類 | トランザクション制御操作 |
| 対になる操作 | ロールバック(Rollback) |
| SQL構文 | COMMIT; |
| 関連するACID特性 | 原子性(Atomicity)・永続性(Durability) |
解説
なぜコミットが必要なのか
データベースでは、1つの業務処理が複数のSQL文で構成されることが当たり前です。
たとえば銀行の振込処理では「送金元の残高を減らすUPDATE文」と「送金先の残高を増やすUPDATE文」の2つが1セットになります。
もし1つ目だけが反映されて2つ目が失敗した場合、お金が消える矛盾が起きます。
これを防ぐために、すべての操作が成功した時点で一括して確定する仕組みが必要になります。この「一括確定」がコミットの役割です。
コミットの動作フロー
トランザクションの開始から終了までの流れを図で整理します。
トランザクションの処理フロー
② SQL文を実行(まだ仮の状態)
-- 送金元の残高を減らす
UPDATE 口座 SET 残高 = 残高 - 10000
WHERE 口座番号 = 'A001';
-- 送金先の残高を増やす
UPDATE 口座 SET 残高 = 残高 + 10000
WHERE 口座番号 = 'B002';
⚠ この時点ではDBに正式反映されていない(仮書き込み状態)
| ③ すべてのSQL文が正常に完了したか? | |
| ✔ Yes(全成功) | ✖ No(1つでも失敗) |
✅ 以後は取り消し不可
✅ ログに記録され障害時も復元可能
🔙 DBはBEGIN直前の状態に戻る
🔙 「何も起きなかった」のと同じ
▲ どちらのルートでもDBは矛盾のない状態を維持する = ACID特性の「原子性」
ロールバックとの関係
コミットとロールバックは、トランザクションの結末を決める2つの対照的な操作です。両者の違いを表で整理します。
| 比較項目 | コミット(Commit) | ロールバック(Rollback) |
|---|---|---|
| 目的 | 変更をデータベースに確定する | 変更を取り消し、開始前の状態に戻す |
| 実行タイミング | すべてのSQL文が正常に完了したとき | 途中でエラーや障害が発生したとき |
| SQL構文 | COMMIT; |
ROLLBACK; |
| 実行後の状態 | 変更が永続化され、取り消し不可 | 変更がなかったことになる |
SQL構文の例
実際のSQL文でコミットがどう使われるか、振込処理を例に示します。
BEGIN TRANSACTION; -- 送金元の残高を減らす UPDATE 口座 SET 残高 = 残高 - 10000 WHERE 口座番号 = 'A001'; -- 送金先の残高を増やす UPDATE 口座 SET 残高 = 残高 + 10000 WHERE 口座番号 = 'B002'; -- 両方成功したら確定 COMMIT;
もし2つ目のUPDATEでエラーが発生した場合は、COMMIT; の代わりに ROLLBACK; を実行して1つ目の変更も取り消します。
これにより、データベースは常に整合性のとれた状態を保てます。
ACID特性との関係
コミットは、トランザクションに求められるACID特性のうち、特に「原子性(Atomicity)」と「永続性(Durability)」を実現する中核的な操作です。
原子性は「全部実行されるか、全部取り消されるか」の二者択一を保証する性質であり、コミットが「全部実行」側の結末を担います。
永続性は「一度確定した変更はシステム障害が起きても消えない」という性質で、コミット完了後の変更内容はログファイルに記録され、障害時にもロールフォワードで復元できます。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 コミットの核心を3行で
・トランザクションの変更をデータベースに確定する操作
・対になるロールバックは変更を取り消して開始前の状態に戻す操作
・ACID特性の原子性・永続性を支える中核的な仕組み
試験ではこう出る!
コミットは、IP・FE・APの午前問題でトランザクション制御の基本知識として繰り返し出題されています。
📊 過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| IP R5 問66 |
トランザクション処理におけるコミットの説明として適切なものを選ぶ問題。 | ・「正常処理後にDBへの更新を確定」が正解 ・排他制御・ロールバック・結合操作の説明がひっかけ |
| FE R1秋 午前 問28 |
トランザクションの5つの状態遷移のうち、取ることのない遷移を選ぶ問題。 | ・「アボート処理中→コミット処理中」は起こらない ・コミット処理中→アボート処理中は起こり得る |
| FE H29春 午前 問28 |
分散データベースで更新処理を確定する方式を選ぶ問題。 | ・正解は「2相コミット」 ・排他制御・ロールバック・ロールフォワードがひっかけ |
| AP R6秋 午前 問27 |
2相コミットでネットワーク障害が発生した場合の参加者の対応を問う問題。 | ・調停者からの指示を待つ参加者の動作が焦点 ・2相コミットの第1相・第2相の流れの理解が必要 |
📝 IPA試験での出題パターン
パターン1:「コミットの説明を選べ」(IP・FE)
4つの用語説明が並び、コミットに該当するものを選ぶ形式。ひっかけとして「データに対する他のトランザクションからの更新を禁止」(排他制御)、「トランザクション開始前の状態に戻す」(ロールバック)が紛れ込む。ここだけは確実に押さえてください。キーワードは「正常処理」「更新を確定」。
パターン2:「2相コミットの仕組み」(FE・AP)
分散データベース環境で複数サイトの更新を確定する方式として「2相コミット」を選ばせる問題。第1相(コミット可否の問い合わせ)と第2相(確定またはロールバックの指示)の流れを理解していれば正答できる。
試験ではここまででOKです。2相コミットの障害発生時の詳細なリカバリ手順まで問われるのはAP以上のレベルなので、IP・FEの受験者は深追い不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. トランザクション処理におけるコミット(Commit)の説明として、最も適切なものはどれでしょうか?
- A. トランザクションが正常に処理されたとき、データベースへの更新内容を確定させる操作である。
- B. トランザクションが異常終了したとき、更新後ログを使ってデータベースを障害直前の状態に復旧する操作である。
- C. トランザクションが異常終了したとき、更新前ログを使ってデータベースをトランザクション開始前の状態に戻す操作である。
正解と解説を見る
正解:A
解説:
コミットは、トランザクション内のすべての操作が正常に完了した際に、その変更結果をデータベースへ永続的に反映させる操作です。
選択肢Bはロールフォワード(前進復帰)の説明です。ロールフォワードは更新後ログを使い、チェックポイント以降のコミット済みトランザクションを再現してデータベースを障害直前の状態に復旧します。選択肢Cはロールバック(後退復帰)の説明です。ロールバックは更新前ログを使い、未完了のトランザクションの変更を取り消して整合性を回復します。
よくある質問(FAQ)
Q. コミットした後にやっぱり取り消したい場合はどうすればよいですか?
コミット完了後の変更は取り消せません。これはACID特性の永続性によって保証されているためです。誤ってコミットしてしまった場合は、逆の内容のSQL文(例:減らした値を増やすUPDATE文)を新たなトランザクションとして実行するか、DBMSのバックアップから復旧する必要があります。
Q. 「オートコミット」とは何ですか?
オートコミット(Auto Commit)は、SQL文を1つ実行するたびに自動的にコミットされるモードのことです。MySQLなどのRDBMS製品はデフォルトでオートコミットが有効になっています。複数のSQL文を1つのトランザクションとして扱いたい場合は、明示的に BEGIN TRANSACTION; を宣言してオートコミットを一時的に無効にします。IPA試験で直接問われることはほぼありませんが、実務では頻繁に登場する概念です。
Q. 2相コミットはなぜ「2相」と呼ぶのですか?
分散データベース環境で全サイトの整合性を保つために、確定処理を2段階に分けて実行するからです。第1相(投票相)では調停者が各参加サイトに「コミットできるか?」と問い合わせ、全員が「可」と応答した場合に限り、第2相(決定相)で一斉にコミットを実行します。1つでも「否」があれば全サイトにロールバックを指示します。
Q. Gitの「コミット」とデータベースの「コミット」は同じ意味ですか?
「変更を確定させる」という共通のニュアンスはありますが、仕組みは異なります。データベースのコミットはトランザクション内の変更をDBに反映し永続化する操作です。一方、Gitのコミットはファイルの変更履歴をローカルリポジトリに記録する操作で、後から取り消し(revert)や履歴の書き換え(rebase)が可能です。IPA試験で「コミット」と出題された場合は、データベースのトランザクション制御を指すと考えて問題ありません。