トランザクション とらんざくしょん
ACID特性コミットロールバック整合性排他制御SQL
トランザクションについて教えて
簡単に言うとこんな感じ!
トランザクションは「ひとまとめにやるか、全部やらないか」の仕組みだよ! 銀行振込で「A口座から引く→B口座に足す」の2ステップは必ず両方成功しないとダメだよね。片方だけ成功したらお金が消えちゃう。それを防ぐのがトランザクションってこと!
トランザクションとは
**トランザクション(Transaction)とは、データベースに対する一連の操作を「ひとかたまりの処理単位」として扱う仕組みです。複数の更新処理をまとめて「全部成功する」か「全部なかったことにする」かのどちらかに確定することで、データの整合性(一貫性)**を保証します。
銀行振込を例にすると、「A口座から10,000円を引く」「B口座に10,000円を足す」という2つの操作は必ずセットで完了しなければなりません。システム障害などで途中で止まってしまったとき、片方だけが反映された状態だとお金が消えてしまいます。トランザクションがあれば、失敗した場合は自動的に「A口座から引く」操作もなかったことになります。
この「全部成功=コミット(Commit)」「全部取り消し=ロールバック(Rollback)」という動作がトランザクションの核心です。ショッピングサイトの注文処理、在庫引き当て、会計仕訳など、「絶対に中途半端で終わってはいけない」あらゆるビジネス処理の土台になっています。
トランザクションの仕組み
| 状態 | 説明 |
|---|---|
| BEGIN(開始) | トランザクション開始を宣言。ここから変更が追跡される |
| 処理中 | INSERT / UPDATE / DELETE などの操作を実行。まだDBには確定していない |
| COMMIT(確定) | 全操作を永続化する。以降は変更が見える状態になる |
| ROLLBACK(取り消し) | BEGIN以降の操作をすべて破棄し、開始前の状態に戻す |
BEGIN;
UPDATE accounts SET balance = balance - 10000 WHERE id = 'A';
UPDATE accounts SET balance = balance + 10000 WHERE id = 'B';
-- ここまで問題なければ確定
COMMIT;
-- もし途中でエラーが起きたら取り消し
-- ROLLBACK;
歴史と背景
- 1960年代:大型汎用機でのバッチ処理が主流で、複数ユーザーが同時アクセスする必要が生まれトランザクション管理の概念が発展
- 1970年:エドガー・コッドのリレーショナルモデル論文発表。データ整合性の重要性が理論的に整理される
- 1983年:IBMのジム・グレイらがACID特性を定義。トランザクションが満たすべき条件が明文化された
- 1990年代:Oracleなどの商用RDBMSがACID準拠を標準装備。エンタープライズシステムへ広く普及
- 2000年代後半:NoSQLの登場でACIDを緩めた「結果整合性(Eventual Consistency)」モデルも注目される
- 2010年代〜:分散データベース環境での分散トランザクション(2フェーズコミットなど)が課題となり、NewSQLカテゴリが台頭
トランザクションとACID特性
トランザクションが保証する性質はACIDの4文字で表されます。
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| ISO/IEC 9075 (SQL標準) | BEGIN / COMMIT / ROLLBACK の構文を規定 |
| X/Open XA | 複数DBにまたがる分散トランザクションの標準インターフェース |
| 2PC(2フェーズコミット) | 分散トランザクションを確実にコミット/ロールバックするプロトコル |
関連用語
- ACID特性 — トランザクションが満たすべき4つの性質(原子性・一貫性・独立性・耐久性)
- コミット・ロールバック — トランザクションを確定または取り消す操作
- 分離レベル — 同時実行トランザクション間の干渉をどこまで許容するかの設定
- デッドロック — 複数トランザクションが互いにロック待ちとなり停止する状態
- ロック(排他制御) — データの同時更新を防ぐためにアクセスを制限する仕組み
- MVCC — ロックを最小化しながら整合性を保つ並行処理技術
- ポイントインタイムリカバリ — 障害発生時に任意の時点のDB状態に復元する技術