# ACIDと分離レベル
## 定義
ACID とは、Härder と Reuter が 1983 年に提唱したトランザクションの安全性保証を表す頭字語で、原子性(Atomicity)・一貫性(Consistency)・分離性(Isolation)・永続性(Durability)の 4 特性を指す。原子性は「途中で失敗したら丸ごと中断・破棄できる」こと(abortability)を意味し、マルチスレッドプログラミングにおける原子性(半端な結果が見えない)とは別の概念である。一貫性は「アプリケーション固有の不変条件(invariant)がトランザクション前後で保たれること」で、データベース単独の性質ではなくアプリケーションの責任にも依存する。分離性は「並行実行中のトランザクションが互いに干渉しない」ことで、教科書的な定義は直列化可能性(serializability)だが、性能上の理由から多くの DB はより弱い分離レベルを既定にする。永続性は「コミット後のデータはハードウェア障害があっても失われない」ことで、単一ノードでは WAL と `fsync`、複製環境では一定数のノードへのコピー完了を意味する。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 8 Transactions]] "The Meaning of ACID")
今日、DB が「ACID 準拠」を謳っても、isolation の意味の曖昧さゆえに実際に得られる保証は不明確であり、ACID は「マーケティング用語」化している。ACID 基準を満たさないシステムは BASE(basically available, soft state, eventual consistency)と呼ばれることがあるが、こちらも「ACID でない」以上の明確な定義を持たない。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 8 Transactions]] "The Meaning of ACID")
## 弱い分離レベル
分離性の教科書的定義(直列化可能性)には性能コストが伴うため、実務では以下のような弱い分離レベルが広く使われる。
**read committed**(最も基本的なレベル。Oracle・PostgreSQL・SQL Server の既定):
- ダーティリードの防止: 未コミットのデータを他のトランザクションから見えなくする
- ダーティライトの防止: 未コミットの値を別トランザクションが上書きしないよう、行レベルロックで直列化する
- ダーティリードの防止は多くの場合、コミット済み値と未コミット値の両方を保持し、コミットまでは旧値を返す仕組みで実装される(ロック方式は長時間ブロックの原因になるため一般的でない)
**read uncommitted**: ダーティライトは防ぐがダーティリードは防がない、さらに弱いレベル。
| 分離レベル | ダーティリード | 読み取りスキュー | ファントムリード | 更新のロスト | 書き込みスキュー |
|---|---|---|---|---|---|
| read uncommitted | 可能 | 可能 | 可能 | 可能 | 可能 |
| read committed | 防止 | 可能 | 可能 | 可能 | 可能 |
| スナップショット分離 | 防止 | 防止 | 防止 | 実装依存 | 可能 |
| 直列化可能 | 防止 | 防止 | 防止 | 防止 | 防止 |
(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 8 Transactions]] "Weak Isolation Levels", "Read Committed", Table 8-1)
## 横断的知見
- **2つの独立した教科書(DDIA と 詳説 データベース)が ACID の出典を同じ Härder & Reuter 1983 に帰し、同じ4段階の分離レベル階層(read uncommitted → read committed → repeatable read → serializable)を提示する**: 詳説 データベース5章は "これら4つの特性は、一般的に ACID と呼ばれます[HAERDER83]" と明記し、read uncommitted(ダーティリード許容)・read committed(ダーティリードのみ防止)・repeatable read(ノンリピータブルリードも防止)・serializability(最強)という同じ順序の階層を独立に説明する。DDIA の Table 8-1 と詳説 データベースの図5-5 は、どちらも分離レベルが強くなるほど許容されるアノマリーが減るという同じ単調な構造を示しており、2つの教科書が独立に同じ定義体系へ収束している。ただし詳説 データベースの図5-5 はダーティ・ノンリピータブル・ファントムの3列のみで、DDIA の表はさらに更新のロスト・書き込みスキューの2列を加えた5列であり、後者のほうが粒度が細かい。これは DDIA が「読み取りアノマリー」と「書き込みアノマリー」を統合した表を作った一方、詳説 データベースは読み取りアノマリーの表(図5-5)と書き込みアノマリーの説明(§5.3.3)を分けて記述していることに由来する構成上の違いであり、内容の矛盾ではない。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 8 Transactions]] Table 8-1, [[@2021__OReillyJapan__詳説 データベース - Chapter 5 トランザクション処理とリカバリ]] 図5-5, §5.3.3)
- **「分離性は直列化可能性を意味する」という主張を、2つの教科書が異なる論拠で補強している**: DDIA は分離性の教科書的定義を直列化可能性としつつ、性能上の理由で多くの DB がより弱い分離レベルを既定にすると述べる。詳説 データベース5章も同様に "ACID という用語の中で分離性は、直列化可能性を意味します[BAILIS14a]" と明記し、直列化可能性の実装には調整コストが伴う([BAILIS14b])と補足する。両者は異なる引用元(DDIA は一般的な教科書的説明、詳説 データベースは Bailis の2014年の論文2本)から同じ結論に達しており、「分離性の理論的定義と実務での妥協」という構図が単一著者の見解ではなく分野で広く共有された認識であることを裏付ける。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 8 Transactions]] "Serializability", [[@2021__OReillyJapan__詳説 データベース - Chapter 5 トランザクション処理とリカバリ]] §5.3.4)
- **単一ノードの原子性(A)は「単一の不可逆点」を持つが、分散環境の原子性は「複数の不可逆点の合意」を要求する**: 本ページが定義する原子性(abortability: 途中で失敗したら丸ごと中断・破棄できる)は、単一ノードでは「WAL への書き込み → コミットレコードの書き込み」という一直線のプロセスで実現できる。しかし [[分散トランザクション]]が扱う 2PC は、コホートの「投票の後戻り不能点」とコーディネータの「決定の後戻り不能点」という 2 段階の不可逆点を持ち、[[@2021__OReillyJapan__詳説 データベース - Chapter 13 分散トランザクション]]が詳述するとおりこの間にコーディネータが障害を起こすとコホートは決定を知る手段を失う(未決定状態)。単一ノードの ACID における原子性の定義自体は分散環境でも変わらないが、それを実現するプロトコルの複雑さ(不可逆点の数)は本質的に増加する。これは「なぜ分散トランザクションが単一ノードトランザクションより難しいか」を原子性という一つの特性に絞って説明する。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 8 Transactions]] "The Meaning of ACID", [[@2021__OReillyJapan__詳説 データベース - Chapter 13 分散トランザクション]] §13.1, §13.2.2)
## 未解決の問い
- read committed の実装で「旧値を返す」アプローチは、スナップショット分離の MVCC 実装(→ [[スナップショット分離とMVCC]])とどこまで機構を共有しているか。両者を単一の可視性ルールの特殊ケースとして統一的に説明できるか。
- ACID の「C」(一貫性)がアプリケーション側の責任だとすると、データベースが宣言的に強制できる不変条件の範囲(制約・トリガー・マテリアライズドビュー)は、書き込みスキュー(→ [[ロストアップデートと書き込みスキュー]])が示す「複数オブジェクトにまたがる不変条件」までどこまで拡張できるか。
- BASE という用語が「ACID でない」以上の意味を持たないなら、結果整合性システムの安全性保証をより精密に記述する語彙(→ [[外部一貫性]])とどう接続すべきか。
- 詳説 データベースの図5-5(3列)と DDIA の Table 8-1(5列)のように、教科書によってアノマリー表の粒度が異なる。両者を統合した最大公約数のアノマリー分類表を作るとすれば、読み取り系・書き込み系のどちらを主軸に据えるべきか。
- 分散環境で原子性を保証する不可逆点は 2PC で 2 段階(投票確定・決定確定)だが、3PC は準備フェーズを追加して 3 段階にする代わりにコーディネータ障害時のブロッキングを緩和しようとする(→ [[@2021__OReillyJapan__詳説 データベース - Chapter 13 分散トランザクション]] §13.3)。不可逆点の段階数と可用性のトレードオフを一般化して記述できるか。単一ノードの原子性の「1段階」が理想であり、分散環境はそこに近づこうとして段階を増減させている、という整理は妥当か。
## 関連
- ソース: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 8 Transactions]] / [[@2021__OReillyJapan__詳説 データベース - Chapter 5 トランザクション処理とリカバリ]] / [[@2021__OReillyJapan__詳説 データベース - Chapter 13 分散トランザクション]]
- 概念: [[スナップショット分離とMVCC]] / [[ロストアップデートと書き込みスキュー]] / [[直列化可能性]] / [[分散トランザクション]] / [[外部一貫性]]
- 実体: [[PostgreSQL]]
## 出典
- [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 8 Transactions]]("The Meaning of ACID", "Weak Isolation Levels", "Read Committed")
- [[@2021__OReillyJapan__詳説 データベース - Chapter 5 トランザクション処理とリカバリ]](§5.0 ACIDの定義、§5.3.3-5.3.4 アノマリーと分離レベル階層)
- [[@2021__OReillyJapan__詳説 データベース - Chapter 13 分散トランザクション]](§13.1-13.2 分散環境における原子性の不可逆点構造)