データベースとトランザクション理論
RDB/分散DBの正しさと性能を支える理論群。_moc-web-infra
ACID特性
トランザクションが満たすべき4性質。
- Atomicity: 全て実行されるか全く実行されないか
- Consistency: 矛盾(整合性制約違反)が起きない
- Isolation: 並行実行しても互いに干渉しない
- Durability: コミット結果は永続的
CAP定理
分散DBでは Consistency(一貫性)・Availability(可用性)・Partition-tolerance(分断耐性)の3つを同時には満たせない。ネットワーク分断が前提なので実質 CP か AP の選択になる。
トランザクション分離レベル
弱い順に異常が起きる。READ UNCOMMITTED < READ COMMITTED(PostgreSQL/Oracleの既定) < REPEATABLE READ(MySQLの既定) < SERIALIZABLE。
- Dirty Read: 未コミットデータを読む
- Fuzzy/Non-Repeatable Read: 再読込で値が変わる
- Phantom Read: 範囲処理中に他txの追加行が見える
SERIALIZABLEは読む全行に共有ロックをかけるため性能が落ちる。
排他制御
- 楽観ロック: ロックせず、更新時に値が初回と同じかチェック(version列など)
- 悲観ロック:
SELECT ... FOR UPDATEで先にロック
直列化可能性とSilo
トランザクションスケジュールの正しさは「直列実行と同じ結果(Serializable)」で定義される。判定強度の異なる等価性: Final State < View Equivalence(NP完全) < Conflict Serializability(CSR、高速判定可)。Two Phase Lock は CSR を動的に生成できるがデッドロックが起き、Wait-Die / Wound-Wait / No-Wait で回避する。Optimistic Concurrency Control はコミットまでロックを取らない方式で、Read が多くマルチコアにスケールするため近年の研究で主流。
- ログ: ディスクのヘッドシークを減らすためトランザクションをログ(undo/redo、冪等)にまとめ、秒間コミット数を稼ぐ。
- In-Memory DB は Redo ログのみで十分。Bw-Tree/Mass-Tree などマルチコア特化のB+木亜種が研究されている。
- Silo(SOSP’13): 40msごとにインクリメントするグローバルなエポックを用いてTIDの上位32bitを決め、ログ順序管理のボトルネック(中央集権的increment)を回避。700k tx/s/32core。
- Google Spanner: 複数DC間複製・SQLライクKVS。TrueTime API で時刻ずれを管理。OSS実装が CockroachDB。
スケーリングと整合性
- nosql-databases と RDB のトレードオフ
- シャーディング: 水平分割(行をキーで複数ノードへ分散)
- レプリケーション: 読み取りスケールのため read replica を増やす。postgresql や Amazon Aurora(最大15 read replica)
- 結果整合性(Eventual Consistency): スケーラビリティのため一貫性を緩めた整合性モデルの一種。線形化可能性・逐次一貫性・Causal Consistency・Read Your Write など強度の異なるモデルがある。
- テーブル正規化: 冗長を排し更新異常を防ぐ設計
関連
- cqrs-event-sourcing / microservices-architecture(Saga, 分散トランザクション)
- redis / postgresql