コミット・ロールバック こみっと・ろーるばっく
トランザクションACID特性データ整合性セーブポイント障害回復
コミット・ロールバックについて教えて
簡単に言うとこんな感じ!
コミットは「変更を正式に保存するボタン」、ロールバックは「全部なかったことにする取り消しボタン」だよ! ゲームの「セーブ」と「タイトルに戻る」に似てる。DBへの変更はコミットするまで仮の状態で、失敗したらロールバックで元に戻せるってこと!
コミット・ロールバックとは
コミット(COMMIT)とは、トランザクション内で行ったすべての変更(追加・更新・削除)をデータベースに正式に確定・保存する操作です。コミットが完了して初めて変更が「永続化」され、他のユーザーからも見えるようになります。
ロールバック(ROLLBACK)とは、トランザクション内で行ったすべての変更を取り消し、トランザクション開始前の状態に戻す操作です。処理の途中でエラーが発生したり、業務ルール上の矛盾が検出されたりした場合に、データの不整合を防ぐために使います。
この2つの操作はトランザクション管理の「終着点」であり、ACID特性の原子性(Atomicity)を実現する具体的な手段です。アプリケーション開発では「try-catch 構文と組み合わせて、例外が起きたらROLLBACKする」パターンが定石になっています。
コミット・ロールバックの動作フロー
セーブポイント(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製品 | トランザクション開始 | 確定 | 取り消し |
|---|---|---|---|
| PostgreSQL | BEGIN; | COMMIT; | ROLLBACK; |
| MySQL / MariaDB | START TRANSACTION; | COMMIT; | ROLLBACK; |
| Oracle | 自動開始(DDL前) | COMMIT; | ROLLBACK; |
| SQL Server | BEGIN TRANSACTION; | COMMIT; | ROLLBACK; |
| SQLite | BEGIN; | COMMIT; | ROLLBACK; |
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| ISO/IEC 9075 SQL-86 | COMMIT WORK / ROLLBACK WORK の最初の標準化 |
| ISO/IEC 9075 SQL:1999 | SAVEPOINTの追加と分離レベルの詳細規定 |
| X/Open XA | 分散トランザクションでのCOMMIT/ROLLBACKの2フェーズ協調 |
関連用語
- トランザクション — 一連のDB操作をひとまとめに扱う仕組み
- ACID特性 — トランザクションが満たすべき4つの性質
- 分離レベル — 同時実行トランザクション間の干渉をどこまで許容するかの設定
- デッドロック — 複数トランザクションが互いにロック待ちとなり停止する状態
- ロック(排他制御) — データの同時更新を防ぐためにアクセスを制限する仕組み
- ポイントインタイムリカバリ — 障害発生時に任意の時点のDB状態に復元する技術
- バキューム・VACUUM — ロールバックで不要になったデータ領域を回収するPostgreSQLの機能