ホーム第7章: データベース
第7章 4節

トランザクションとACID特性

データベースには、常に何百、何千ものプログラムから同時に書き込み要求が殺到します。また、サーバーの電源が突如切れたり、ネットワークが切断されたりする物理的な障害も日常茶飯事です。このような過酷な環境下で、預金残高や商品の在庫といった「絶対に壊れてはいけないデータ」の整合性を完全に守り抜くための仕組みが「トランザクション」と「ACID特性」です。

1. トランザクション(Transaction)とは?

データベースにおけるトランザクション(Transaction)とは、「これ以上分割することができない、いくつかの処理を1つにまとめた実行単位」のことです。

最もわかりやすい例は、銀行の「口座振込(Aさんの口座からBさんの口座へ 1万円を振り込む)」処理です。 この処理は、内部的に以下の2つのSQL文(ステップ)で構成されます。

  1. 「Aさんの口座から 1万円を差し引く(UPDATE)」
  2. 「Bさんの口座に 1万円を加算する(UPDATE)」

もし、ステップ1(差し引き)が成功した直後、ステップ2(加算)の処理を行う直前に、サーバーが停電で強制シャットダウンしてしまったらどうなるでしょうか。 Aさんの口座からは1万円が消え去ったのに、Bさんの口座には届いていないという、致命的なデータ破壊(消失)が発生します。

このような事態を防ぐため、トランザクションは「すべて成功するか(All)、全く実行されなかったことにするか(Nothing)」のどちらかしか認めないというルールで動きます。

2. コミット(Commit)とロールバック(Rollback)

トランザクションを実行する際、DBMSは以下の2つの操作で整合性をコントロールします。

振込処理開始 トランザクション内部 1. Aから1万円減額 2. Bに1万円増額 成功? Yes コミット (確定) No ロールバック (取消)
図 7-4:トランザクション制御(コミットとロールバック)の流れ
  • コミット(Commit): すべての処理が正常に完了した際、その変更内容をデータベースに正式かつ「永久に確定」させる指示です。
  • ロールバック(Rollback): 処理の途中でエラーが発生したり、停電などで中断された場合、そこまでに行った処理を「すべてキャンセル」し、トランザクション開始前の状態にデータベースを巻き戻す指示です。

3. 鉄壁の信頼性:ACID特性

RDBMSは、トランザクションの信頼性を100%保証するために、以下の4つの性質(ACID特性)を厳格に維持するように設計されています。

ACIDの4つの性質
  • Atomicity:原子性(不可分性)
    トランザクションに含まれる処理は、「すべて実行される(All)」か、「一切実行されない(Nothing)」かのどちらかしかありません。中途半端な状態は許されません。
  • Consistency:一貫性(整合性)
    トランザクションの実行前後で、データベースのルール(例:「残高はマイナスになってはならない」などの一貫性制約)が決して破られない性質です。ルール違反が起きる場合は、トランザクション全体が自動的にロールバックされます。
  • Isolation:独立性(隔離性)
    複数のトランザクションが同時に並行実行されても、互いに邪魔をせず、あたかも1つずつ順番(直列)に実行されたのと同じ結果になる性質です。これにより、同時アクセスによるデータ破壊を防ぎます。
  • Durability:永続性(持続性)
    一度コミットが完了したデータは、たとえその直後にコンピュータが物理的に爆発したり、停電でクラッシュしたりしても、ディスクにログが書き出されているため、絶対に失われることなく復旧できる性質です。

4. まとめ

データベースは、RDBMS(関係データベース)という形式でデータをテーブルに整理し(正規化)、SQLという宣言型言語で効率よく操作し、トランザクションとACID特性によって何があってもデータを壊さない信頼性を構築してきました。

次の第8章(最終章)では、ここまでに学んだすべてのシステム(OS、メモリ、データベース、ネットワーク)を安全に防衛するための「セキュリティ(暗号)」と、コンピュータサイエンスの究極の理論的限界である「計算限界」について学びます。

現実世界と繋ぐ:銀行口座の送金と「ACID特性」:お金が絶対に消えないためのデータベースの約束

もし、Aさんの銀行口座から「1万円を引き落とす」処理が成功した直後に、ATMや銀行のサーバーが停電で強制終了してしまったらどうなるでしょうか?「Bさんの口座に1万円を追加する」処理が行われないままシステムが止まると、その1万円は宇宙の彼方に消えてしまいます。

  • お金を守る「原子性 (Atomicity)」: 銀行のシステムでは、引き落としと振り込みを1つの「トランザクション」として扱います。途中で障害が発生した場合、データベースは処理を「開始前の状態」に巻き戻します(ロールバック)。これにより、「引き落としだけ行われて消える」という最悪の事態を防ぎます。
  • 残高不足を防ぐ「一貫性 (Consistency)」と「隔離性 (Isolation)」: 隔離性(アイソレーション)の保証によって、同時に発生した他の引き出し処理や振り込み処理が混ざり合って残高がおかしくなるのを防ぎます。すべての処理は裏側で順番に、矛盾がないよう(一貫性を保って)処理されます。

世界中の決済やECサイト、フリマアプリなどでトラブルなくお金がやり取りできるのは、データベースがこのACID特性という「鉄の約束」を厳格に守り続けているからなのです。