データベース操作・制御

コミット・ロールバック こみっと・ろーるばっく

トランザクションACID特性データ整合性セーブポイント障害回復
コミット・ロールバックについて教えて

簡単に言うとこんな感じ!

コミットは「変更を正式に保存するボタン」、ロールバックは「全部なかったことにする取り消しボタン」だよ! ゲームの「セーブ」と「タイトルに戻る」に似てる。DBへの変更はコミットするまで仮の状態で、失敗したらロールバックで元に戻せるってこと!


コミット・ロールバックとは

コミット(COMMIT)とは、トランザクション内で行ったすべての変更(追加・更新・削除)をデータベースに正式に確定・保存する操作です。コミットが完了して初めて変更が「永続化」され、他のユーザーからも見えるようになります。

ロールバック(ROLLBACK)とは、トランザクション内で行ったすべての変更を取り消し、トランザクション開始前の状態に戻す操作です。処理の途中でエラーが発生したり、業務ルール上の矛盾が検出されたりした場合に、データの不整合を防ぐために使います。

この2つの操作はトランザクション管理の「終着点」であり、ACID特性の原子性(Atomicity)を実現する具体的な手段です。アプリケーション開発では「try-catch 構文と組み合わせて、例外が起きたらROLLBACKする」パターンが定石になっています。


コミット・ロールバックの動作フロー

トランザクションのライフサイクル BEGIN(開始) SQL操作(INSERT / UPDATE / DELETE) ※この段階ではまだ仮の状態(他ユーザーには見えない) COMMIT 変更を永続化・確定 ROLLBACK 変更を全て取り消し DB確定・他者から見える BEGIN前の状態に復元 成功 エラー

セーブポイント(SAVEPOINT)

トランザクション内に「中間チェックポイント」を設定する機能です。ROLLBACKの対象をセーブポイントまでに限定でき、複雑な処理の一部だけをやり直すことができます。

BEGIN;
INSERT INTO orders (...) VALUES (...);   -- 注文登録
SAVEPOINT after_order;                    -- セーブポイント設定

UPDATE inventory SET stock = stock - 1 WHERE ...;  -- 在庫引き当て

-- 在庫チェックで問題があればセーブポイントまで戻す
ROLLBACK TO SAVEPOINT after_order;

-- 全体をなかったことにする場合
-- ROLLBACK;

COMMIT;

歴史と背景

  • 1970年代:トランザクションログ(ジャーナル)の概念が大型汎用機DBで実装され始める
  • 1983年:ジム・グレイらがACID特性を定義。COMMITとROLLBACKがトランザクション管理の標準用語として確立
  • 1986年:SQL-86(最初のSQL国際標準)でCOMMIT WORK / ROLLBACK WORK が規定される
  • 1999年:SQL:1999でSAVEPOINT構文が標準化
  • 現在:ORMフレームワーク(Rails、Django、Hibernate等)が自動的にトランザクション管理を行い、開発者が明示的にBEGIN/COMMITを書く場面は減少。ただし概念理解はトラブルシューティングに不可欠

主要DBでの構文比較

DB製品トランザクション開始確定取り消し
PostgreSQLBEGIN;COMMIT;ROLLBACK;
MySQL / MariaDBSTART TRANSACTION;COMMIT;ROLLBACK;
Oracle自動開始(DDL前)COMMIT;ROLLBACK;
SQL ServerBEGIN TRANSACTION;COMMIT;ROLLBACK;
SQLiteBEGIN;COMMIT;ROLLBACK;

関連する規格・RFC

規格内容
ISO/IEC 9075 SQL-86COMMIT WORK / ROLLBACK WORK の最初の標準化
ISO/IEC 9075 SQL:1999SAVEPOINTの追加と分離レベルの詳細規定
X/Open XA分散トランザクションでのCOMMIT/ROLLBACKの2フェーズ協調

関連用語