コース一覧
データベース内部構造:インデックス・トランザクション・分散DB
結果整合性

データベース内部構造:インデックス・トランザクション・分散DB

SQLの書き方ではなく、DBMSの内側を学ぶコースです。RDBとNoSQL、正規化、B-tree、トランザクションとMVCC、クエリプランナ、レプリケーションと分散SQLを通して、性能と整合性の判断根拠を身につけます。

1
データベースの基礎
0. データベースとは8分
1. RDB と NoSQL の違い8分
2. データベースの歴史8分
3. エンティティ関係モデル (ER)8分
4. 主キー・外部キー・候補キー8分
2
正規化
0. 正規化とは何か8分
1. 第1正規形8分
2. 第2正規形8分
3. 第3正規形8分
4. 非正規化のトレードオフ8分
3
インデックスと B-tree
0. インデックスの役割8分
1. B-tree の仕組み8分
2. B+tree(実際の DB 実装)8分
3. ハッシュインデックス8分
4. カバリングインデックス8分
4
トランザクションと ACID
0. トランザクションとは8分
1. ACID 特性8分
2. 分離レベル8分
3. MVCC(マルチバージョン同時実行制御)8分
4. デッドロックと回避8分
5
クエリ最適化
0. クエリプランナの役割8分
1. EXPLAIN の読み方8分
2. Nested Loop / Hash / Merge Join8分
3. インデックスチューニング8分
4. 統計情報とカーディナリティ8分
6
スケーリング
0. レプリケーション8分
1. シャーディング8分
2. CAP 定理8分
3. 結果整合性8分
4. NewSQL と分散 SQL8分

データベース内部構造:インデックス・トランザクション・分散DB

01データベースとは
02RDB と NoSQL の違い
03データベースの歴史
04エンティティ関係モデル (ER)
05主キー・外部キー・候補キー
06正規化とは何か
07第1正規形
08第2正規形
09第3正規形
10非正規化のトレードオフ
11インデックスの役割
12B-tree の仕組み
13B+tree(実際の DB 実装)
14ハッシュインデックス
15カバリングインデックス
16トランザクションとは
17ACID 特性
18分離レベル
19MVCC(マルチバージョン同時実行制御)
20デッドロックと回避
21クエリプランナの役割
22EXPLAIN の読み方
23Nested Loop / Hash / Merge Join
24インデックスチューニング
25統計情報とカーディナリティ
26レプリケーション
27シャーディング
28CAP 定理
29結果整合性
30NewSQL と分散 SQL

データベース内部構造:インデックス・トランザクション・分散DB

結果整合性

投稿した直後に、自分の投稿が見当たらない

コメントを送信した。成功と表示された。一覧に戻ったら、自分のコメントがない。もう一度読み込むと、今度は出てくる。

送信は 1 台目に届き、一覧の取得はまだ反映の終わっていない 2 台目から読んだ、というだけの話です。数秒待てば全台が揃います。この「最終的には全部が同じ値に落ち着く。ただし途中は揃っていない」という性質を結果整合性と呼びます。前の回のレプリカの遅れも、分断のときに古い値を返す側へ倒した結果も、行き着く先はここです。ACID に対して BASE と呼ばれるのも、この割り切りの側の設計を指しています。

厄介なのは、利用者から見ると単なるバグに見えることです。書き込みが失われたと思われれば、同じコメントを何度も送られます。

「そのうち揃う」を仕様として扱う

結果整合性は、放っておけば直る不具合ではありません。分散させると決めた時点で選んだ性質なので、揃っていない間の見え方まで設計で決めます。

守る優先順位ははっきりしています。まず、自分が書いたものは自分には必ず見えること。他人の投稿が数秒遅れて見えるのを気にする人はいませんが、自分の投稿が消えるのは耐えられません。書き込んだ直後の読み取りだけ Primary に向ける、あるいはその利用者の接続を書き込んだ台に固定する、といった形で実現します。

次に、後から読んだ方が古くならないこと。読むたびに別の台へ振り分けていると、1 回目に見えたコメントが 2 回目に消えることがあります。同じ利用者の連続した読み取りは、同じ台へ寄せます。

画面の側にも手当てができます。送信した内容をサーバから取り直さず、その場で一覧へ足しておく。「最終更新 3 秒前」と添える。実態が揃っていなくても、利用者の頭の中の整合性は保てます。

どこまで守るかは機能ごとに決めます。全部を強く守ろうとすれば、分散させた意味がなくなります。自分の書き込みが自分に見えることだけを全機能で守り、残りは古くてよいと決める。この線引きを文章にして残しておくと、後から入ったメンバーが「これはバグではないか」と調べ直す時間が減ります。

同時に書かれたとき、どちらを残すか

分断の最中に、別々の台で同じデータが更新されることもあります。復旧したとき 2 つの値が残っているので、どちらかに決めなければなりません。

いちばん簡単なのは、時刻の新しい方を残す方法です。実装は楽ですが、負けた方の書き込みは黙って消えます。しかも台ごとの時計は数ミリ秒ずれるので、「新しい方」が実際の順序と食い違うこともあります。

消したくないなら、そもそも衝突しないデータの持ち方にします。カウンタなら、合計値を上書きするのではなく、台ごとに自分が足したぶんだけを持ち、読むときに合算する。こうすればどの順で反映されても結果は同じです。共同編集ツールが同時編集を壊さずに済ませているのも、根は同じ考え方です。

どの方式を選んだとしても、衝突が起きた事実そのものは記録に残します。残っていないと、消えた書き込みに後から気づく手段がありません。

解説

結果整合性は事故ではなく仕様です。仕様として書いておけば、障害報告ではなく想定内になります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • コメント# で1行コメント。
  • ACID原子性・一貫性・独立性・永続性の4特性
  • 設計何をどう作るかを決める前工程
  • カウンタ数を保持して増減する典型 UI
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/27·更新 2026/08/26

関連レッスン

  • NewSQL と分散 SQL

    TiDB / Spanner が実現する分散環境での ACID

  • CAP 定理

    Consistency / Availability / Partition tolerance の同時達成不可性

  • シャーディング

    水平分割でデータを分散し書き込みを拡張する手法

  • レプリケーション

    Primary / Replica 構成での読み取り分散と整合性

分からないところは Tap (AI先生) に質問できます

24 時間いつでも、あなたのレベルに合わせて日本語で答えます。