ACID特性とCAP定理の「C」は全くの別物である

分散システムについて学習していた時、「整合性」という言葉の意味で混乱しました。調べてみたら、ACIDとCAPの「Consistency」は同じ単語なのに全く違う概念を指していました。

Toshiki Matsukuma | 2026-02-27 | 5分

分散システムについて学習していた時、「整合性(Consistency)」という言葉の意味で混乱しました。

私は単一データベースの設計経験が長かったので、「整合性」と言えば「トランザクション後にデータが正しい状態になっているか」という意味だと思い込んでいました。でも、CAP定理の文脈では「ノード間でデータが同期されているか」という全く違う意味で使われていました。

同じ「整合性(Consistency)」という言葉なのに、全く別の概念を指していたことに気付きました。

調べてみて分かったこと

CAP定理を学習していて、「あれ、ACIDの『C』とCAPの『C』って別の意味じゃないか?」と気付きました。調べてみたら、やっぱり全然違いました。

ACIDのConsistency(私が最初に考えていた方)

これは「トランザクション後にデータがビジネスルールを満たしているか」という話でした。

例えば、銀行の送金処理で考えると:

// トランザクション開始
BEGIN;
// AさんからBさんへ1000円送金
UPDATE accounts SET balance = balance - 1000 WHERE user = 'A';
UPDATE accounts SET balance = balance + 1000 WHERE user = 'B';
// コミット
COMMIT;

このトランザクションが終わった後、以下のルールが守られているか?というのがACIDのConsistency:

  • Aさんの残高がマイナスになっていないか
  • 外部キー制約を違反していないか
  • アプリケーションが定義したビジネスルールを満たしているか

私が最初に考えていたのは、まさにこれでした。

CAPのConsistency(CAP定理で言われている方)

これは「全てのノードが同じデータを見ているか」という話でした。

同じ送金処理で考えると:

// 東京サーバーに書き込み
await tokyo.update({ user: 'A', balance: 9000 });
// 直後に大阪サーバーから読み取り
const balance = await osaka.select({ user: 'A' });
// → まだ10000円(古い値)が返ってくる可能性がある

東京サーバーに書き込んだ瞬間、大阪サーバーでも同じ値が読めるか?というのがCAPのConsistency。

ネットワーク越しのレプリカ間の同期の話なので、ACIDとは全く別の次元の問題でした。

重要な違い

一番の気づきは、この2つでした:

比較軸ACIDの「C」CAPの「C」
前提単一ノード複数ノード(分散)
不整合の対象ビジネスルールとの矛盾レプリカ間のズレ

ACIDは単一ノード、CAPは複数ノード前提という点が、一番の発見でした。同じ「整合性」という言葉を使うのに、対象が全く違います。

まとめ

分散システムについて学習していた時、「整合性」という言葉の意味で混乱しました。調べてみたら、ACIDの「C」とCAPの「C」は同じ単語なのに全く別の概念でした。

特に、ACIDは単一ノード、CAPは複数ノード前提で、不整合の対象も違います(ビジネスルール違反 vs レプリカ間のズレ)。この2つの違いを意識すると、分散システムの学習がスムーズになります。

関連記事