本篇探討資料一致性與隔離。作者先從使用者視角切入——有哪些隔離層級可用、各自的實務影響是什麼——接著才深入內部機制。為此必須說明多版本並行控制(multiversion concurrency control,MVCC)與快照隔離(snapshot isolation)的實作細節,並特別著重過期列版本的清理

本篇涵蓋#

  • 隔離——一致性與完整性的差別、SQL 標準定義的異常現象與隔離層級,以及 PostgreSQL 實際提供的三種層級(Read Committed、Repeatable Read、Serializable)該如何選擇。
  • 頁面與元組——頁面的內部結構、列版本的佈局,以及 insert/commit/delete/abort/update 各項操作在元組層面究竟發生了什麼。
  • 快照——快照是什麼、列版本可見性如何判定、快照的結構、交易水平線(horizon)與快照匯出。
  • 頁面修剪與 HOT 更新——不需完整 vacuum 就能就地回收空間的輕量機制,以及 HOT(Heap-Only Tuple)更新如何避免更動索引。
  • 清理與自動清理——vacuum 的各個階段、資料庫水平線的真正意義、autovacuum 如何決定清理對象、負載節流與監控。
  • 凍結——交易 ID 迴繞(wraparound)問題、凍結的可見性規則與管理方式。
  • 重建表格與索引——完整清理(VACUUM FULL)與其他重建手法,以及使用時的注意事項。

這一篇是全書的地基。MVCC 決定了 PostgreSQL 中「一列被更新」實際上是寫入一個新版本而非就地修改——由此衍生出膨脹(bloat)、清理、凍結等一連串主題,也解釋了為何後續章節反覆回到「哪些列版本還看得見」這個問題。