第 1 章 事务概述 1 1.1 事务的作用 1 1.2 事务的性质 2 1.3 事务的隔离级别 4 1.4 PostgreSQL 中的事务 7 1.5 事务处理流程 20 1.5.1 事务 ID 20 1.5.2 pg_subtrans 日志 25 1.5.3 启动事务 26 1.5.4 事务结束 28 1.6 异步提交 33 1.7 本章小结 35 第 2 章 锁 36 2.1 并发的异常现象 36 2.2 调度 39 2.3 并发控制 41 2.4 两阶段锁 42 2.5 PostgreSQL 中的锁43 2.5.1 自旋锁 45 2.5.2 轻量锁 50 2.5.3 常规锁 56 2.6 常规锁的内存结构 58 2.7 常规锁的加锁 61 2.8 行锁 73 2.9 死锁检测 84 2.10 本章小结 92 第 3 章 MVCC 93 3.1 元组上的版本信息 94 3.2 快照 100 3.3 获得快照 103 3.4 可见性判断 109 3.5 本章小结 113 第 4 章 故障恢复 114 4.1 故障的分类 114 4.2 事务日志 115 4.3 日志文件 116 4.4 查看日志内容 117 4.5 日志格式 120 4.6 XLog 初始化 124 4.7 日志的注册 127 4.8 日志的组成 131 4.9 日志的写入 137 4.10 控制文件 140 4.11 Full Page Write 140 4.12 检查点 142 4.12.1 检查点的触发 144 4.12.2 BgWriter 刷入脏页 148 4.12.3 回写机制 152 4.12.4 Sync 请求 154 4.12.5 检查点的创建 155 4.12.6 检查点中脏页的刷入 157 4.12.7 检查点中的 XLog 清理 159 4.13 日志归档 162 4.14 基础备份 168 4.15 PITR 172 4.16 故障恢复 177 4.17 本章小结 186 第 5 章 物理复制 187 5.1 环境搭建 187 5.2 物理复制 189 5.3 同步复制 195 5.4 Hot Standby 203 5.5 物理复制槽 212 5.6 本章小结 215 第 6 章 逻辑解码与逻辑复制 216 6.1 复制槽 217 6.2 逻辑解码 221 6.2.1 Snapshot Builder 222 6.2.2 Reorder Buffer 237 6.2.3 Logical Decoding 242 6.2.4 Replication Origin 247 6.3 逻辑复制 250 6.3.1 发布与订阅 251 6.3.2 复制的起点 254 6.4 本章小结 257 第 7 章 SSI 258 7.1 SSI 介绍 258 7.1.1 依赖关系 259 7.1.2 S2PL 和 SSI 259 7.1.3 MVCC 和 SSI 261 7.1.4 SSI 方法 262 7.2 “危险结构” 266 7.3 SSI 的优化方法 269 7.4 SSI 的实现方法 271 7.5 本章小结 299 第 8 章 Zheap 引擎 300 8.1 事务槽 301 8.2 TPD 306 8.3 元组的变化 310 8.4 Undo 日志 310 8.4.1 Undo 的文件结构 311 8.4.2 Undo 的内存结构 314 8.4.3 Undo 的页面结构 316 8.5 事务槽的使用 317 8.6 可见性判断 323 8.7 Undo 操作 327 8.8 Undo 日志清理 329 8.9 本章小结 334 第 9 章 两阶段提交 335 9.1 两阶段提交简介 336 9.2 PostgreSQL 中的 2PC 337 9.3 本章小结 342 附录 A 存储引擎概述 343 A.1 存储文件形式 343 A.2 缓冲区 345 A.3 SLRU 347 附录 B 事务的文件结构 352 B.1 access 目录 352 B.2 storage 目录353 B.3 replication 目录 353 B.4 utils 目录 354