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

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

データベースでは、複数のプログラムから同時に書き込み要求が発生します。また、システム障害やネットワーク切断などの問題が生じることもあります。こうした環境下で、預金残高や商品の在庫といったデータの整合性を保つための仕組みが、トランザクションとACID特性です。

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

データベースにおけるトランザクション(Transaction)とは、複数の処理を一つのまとまりとして扱う実行単位のことです。

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

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

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

このような事態を防ぐため、トランザクションは、すべての処理が成功するか、あるいは一切の処理を実行しなかった状態にするか(All-or-Nothing)を保証します。

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

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

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

3. ACID特性

RDBMSにおいて、ACID特性はトランザクションの信頼性とデータの整合性を保証するための設計指針です。以下の4つの性質から構成されます。

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

4. まとめ

データベースは、RDBMS(関係データベース)という形式でデータをテーブルに整理し(正規化)、SQLという宣言型言語で操作し、トランザクションとACID特性によって、データの整合性を保ち、信頼性を確保するための仕組みを備えています。

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

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

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

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

決済やECサイトなどのシステムにおいて矛盾なくデータを処理できるのは、データベースがACID特性に基づき制御を行っているためです。