基礎

注文だけが残った夜 (原子性)

定義

原子性 (atomicity) とは、トランザクションに含まれる複数の更新操作が全て成功して確定される、または全てなかったことにされるのいずれかしか取らないという性質であり、部分的な適用による矛盾状態の発生を防ぐ ACID 特性の一つである。

事故 — 注文だけが残った夜

ある EC サイトの受注は、受注ボタンが押されるたびに 2 段階の Excel マクロで処理されていた。 まず注文シートに 1 行追加し、次に商品シートの在庫を 1 減らす。ある夜、注文シートに書き込んだ直後にネットワークが瞬断してマクロが止まった。翌朝スタッフが気付いた時には、 注文は残ったまま 商品の在庫が減らされていない 状態だった。

これが単発の 1 件で終わればまだ被害は小さい。実際、冒頭の「壊れた Excel」でも P-042 座布団は 1 日で 5 件売れたはずなのに在庫はまだ 12 のまま — 初日は数個の差にすぎない。 しかしマクロは毎日何百件も実行され、同じ形の中断が週に数件のペースで起き続けた。数週間後、商品シートの在庫は実在庫より 20 個以上多い値 を示すようになっていた。

営業担当が「在庫あり」と表示された商品を客に売っても、倉庫には物理的に商品が無い。 出荷指示を受けた倉庫スタッフから何度も返品連絡が入り、顧客対応が破綻した。

先に用語を 3 つだけ整理
  • トランザクション: 「複数の変更を 1 つの塊として扱う」単位。 この塊の中身は「全部やる」か「1 つもやらない」かのどちらかしか許さない
  • コミット (COMMIT): トランザクション内の変更を「全部確定させる」操作。 これ以降、変更は永続化される
  • ロールバック (ROLLBACK): トランザクション内の変更を「全部なかったことにする」操作。 途中でエラーが起きた時に呼び出される
以下、この 3 語を前提に解説します。詳細な SQL 例は「解決策」節で扱います。

原因 — Excel には「まとめて確定」の単位がない

Excel / Sheets には 「複数の変更を 1 つのトランザクションとして扱う」 仕組みがない。 マクロで擬似的に順番に実行しても、どこかで止まれば「片方だけ適用された中途半端な状態」が残る。 RDB ならこの時点で自動 ROLLBACK が走って両方戻せるが、Excel には ROLLBACK 相当の機能がない。 マクロがどこまで進んだかも、変更がまとめて COMMIT されたかどうかも、記録されない。

Excel マクロの操作履歴 — 途中で止まると片方だけ残る
  1. OP注文シートに ORD-001 を追加
  2. EVENTネットワーク瞬断 — マクロ停止
    この時点で注文行だけがシートに残り、在庫は減算されていない
  3. OP商品シートの在庫を -1 する
    本来ここで実行されるはずだった処理 (実行されない)
結末
注文だけ記録され、在庫は減っていない (整合性喪失)

解決策 — トランザクション (BEGIN / COMMIT / ROLLBACK)

RDB では複数の SQL 文を BEGIN と COMMIT で挟む ことで、その間の全ての変更を「1 つの塊」として扱える。 途中でエラーが起きたら ROLLBACK で全て戻す。COMMIT する前の変更は誰にも見えず、COMMIT した瞬間にまとめて確定する。

BEGIN;
INSERT INTO orders (customer_id, product_id, qty)
  VALUES ('C-001', 'P-042', 1);
UPDATE products
  SET stock = stock - 1
  WHERE id = 'P-042';
COMMIT;

この BEGIN...COMMIT の間で通信が切れたりサーバがクラッシュしても、RDB は自動で ROLLBACK する。「注文は追加されたが在庫は減らない」中途半端な状態は構造的に発生しない。

RDB のトランザクション — 途中で止まっても両方戻る
  1. BEGINBEGIN
  2. OPINSERT INTO orders ...
  3. EVENTネットワーク瞬断
    COMMIT 前の中途半端な状態を DBMS が検知
  4. ROLLBACKAUTO ROLLBACK
    INSERT も UPDATE も全てなかったことに
結末
中途半端な状態が残らない (整合性守られる)

境界事例と誤解

  • オートコミットの罠: 多くのクライアントは既定でオートコミット (各文が独立トランザクション)。 複数文を原子的に扱いたい時は明示的に BEGIN しないと、片方だけ確定するリスクが残る。
  • トランザクションの入れ子: SAVEPOINT で部分的な戻しは可能だが、 外側の BEGIN..COMMIT を跨いだ「片方コミット」はできない。
  • 原子性は分離性を含意しない: 「途中で止まらない」と「他人の同時変更から守る」は別問題。 後者は次の 同時実行制御 で扱う。

よくある疑問

Q.トランザクションを使えば必ずデータが守られる?
A.原子性は「途中で止まらない」ことを保証しますが、他人の同時操作から守るのは分離性 (concurrency 側の話) です。両方揃って初めて「守られている」状態になります。
Q.Excel の Ctrl+Z (Undo) とトランザクションの ROLLBACK は何が違う?
A.Undo は「1 操作を戻す」のに対し、ROLLBACK は「BEGIN からの複数操作をまとめて戻す」動作です。Undo は他のユーザーの操作を巻き込んで戻せませんが、ROLLBACK は自分のトランザクション内のみを一貫して戻します。
Q.原子性と一貫性 (Consistency) の違いは?
A.原子性は「全か無か」の実行保証で、一貫性は「実行前後で制約が保たれる」ことです。原子性は実行モデル、一貫性は結果状態の話で、階層が異なります。
Q.「オートコミット」モードとは?
A.各 SQL 文が暗黙に BEGIN/COMMIT に囲まれるモードです。便利ですが、複数文を原子的に扱いたい時は明示的に BEGIN しないと途中で止まった時に片方だけ残ります。

もっと学びたい方へ(おすすめ書籍)

おすすめ
達人に学ぶDB設計徹底指南書 第2版
ミック

テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。

Amazon で見る →
[改訂3版]内部構造から学ぶPostgreSQL
勝俣智成 ほか

PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。

Amazon で見る →
情報処理教科書 データベーススペシャリスト 2025年版
三好康之

IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。

Amazon で見る →
理論から学ぶデータベース実践入門
奥野幹也

リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。

Amazon で見る →
おすすめ
楽々ERDレッスン (CodeZine BOOKS)
羽生章洋

ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。

Amazon で見る →
達人に学ぶSQL徹底指南書 第2版
ミック

SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。

Amazon で見る →
SQLアンチパターン 第2版
Bill Karwin

実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。

Amazon で見る →

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講