第 8 章 · 05 事务 ACID 与 SQLite 哲学


文档摘要

第 8 章 · 05 事务 ACID 与 SQLite 哲学 本节摘要:这是第 8 章的收尾节,讲两件事:事务的 ACID(尤其原子性与持久性的工程实现),以及参考 SQLite 的设计哲学收尾你的迷你数据库。事务保证「一组操作全做或全不做」——靠 WAL 的回滚段实现原子性,靠 fsync 日志实现持久性。SQLite 把「页式存储 + B+树 + WAL」精巧组合成单文件嵌入式数据库,你的迷你数据库可以照着这个思路收尾。 内容来源:基于数据库事务与 SQLite 设计整理的导读。 学习目标 说清 ACID:原子性、一致性、隔离性、持久性,各自的工程实现。 解释原子性如何用 WAL 的回滚段实现(事务失败则回滚已做部分)。 解释隔离性的基础(锁/MVCC 的思想,深度展开留给进阶)。

第 8 章 · 05 事务 ACID 与 SQLite 哲学

本节摘要:这是第 8 章的收尾节,讲两件事:事务的 ACID(尤其原子性与持久性的工程实现),以及参考 SQLite 的设计哲学收尾你的迷你数据库。事务保证「一组操作全做或全不做」——靠 WAL 的回滚段实现原子性,靠 fsync 日志实现持久性。SQLite 把「页式存储 + B+树 + WAL」精巧组合成单文件嵌入式数据库,你的迷你数据库可以照着这个思路收尾。

内容来源:基于数据库事务与 SQLite 设计整理的导读。

学习目标

  1. 说清 ACID:原子性、一致性、隔离性、持久性,各自的工程实现。
  2. 解释原子性如何用 WAL 的回滚段实现(事务失败则回滚已做部分)。
  3. 解释隔离性的基础(锁/MVCC 的思想,深度展开留给进阶)。
  4. 理解 SQLite 的单文件嵌入式哲学。
  5. 收尾一个能「存、查、持久、事务」的迷你数据库。

一、学习价值:事务是数据库区别于普通存储的根本

普通文件存储也能存取数据,但数据库多了「事务」——一组操作要么全成功要么全回滚。这是数据库支撑金融、订单、库存等关键业务的根本。理解 ACID 的工程实现,你才真正理解「为什么用数据库而非文件」。

二、子系统拆解:ACID

A(Atomicity 原子性):全做或全不做

事务含多条操作,若中途失败,已做的必须回滚。实现:WAL 里记「before image」(改之前的样子),失败时用 before image 撤销。呼应第 5 章编辑器的「撤销」思想——本质都是「记下反向操作」。

C(Consistency 一致性):应用层约束不被破坏

事务执行后,数据库仍满足约束(主键唯一、外键、CHECK)。一致性由应用层约束 + 原子性/隔离性/持久性共同保证——它更像是「目标」,由其他三个支撑。

I(Isolation 隔离性):并发事务互不干扰

多个事务并发执行,结果应等价于某串行顺序。实现思路:

  • :事务读/写前加锁,串行化。简单但并发低、易死锁。
  • MVCC(多版本并发控制):每事务看到一个快照版本,读不阻塞写、写不阻塞读。PostgreSQL/MySQL InnoDB 用。深度展开留给进阶书。

迷你数据库可简化:全局锁(一次一个事务),保证隔离但牺牲并发。

D(Durability 持久性):提交了就不丢

事务一旦提交(commit),即使断电也不丢。实现:第 04 节的 WAL——commit 时 fsync 日志,日志落盘=提交成功。

事务的实现骨架

BEGIN: 记事务开始 操作1: 记 before image, 改数据 操作2: 记 before image, 改数据 ... COMMIT: 写 commit 记录到 WAL, fsync → 持久性达成 # 若中途中断(未到 COMMIT): 启动时用 before image 回滚 → 原子性达成

三、SQLite 哲学:单文件嵌入式

SQLite 把整个数据库放一个文件,内含「页式存储(B+树)+ WAL」,作为库嵌入应用进程运行(无独立服务进程)。优点:零配置、单文件、跨平台、嵌入式。它广泛用在手机 App、浏览器(WebStorage/IndexedDB 底层)、桌面软件里。

你的迷你数据库照这个思路:一个文件、页式 B+树、WAL、简单事务,就是一个能用的嵌入式 KV 或表存储。

四、上手第一步

  1. 实现 BEGIN/COMMIT/ROLLBACK(简化:全局锁,一次一事务)。
  2. 每次改数据记 before image 到 WAL。
  3. COMMIT 写 commit 标记 + fsync;ROLLBACK 用 before image 撤销。
  4. 启动时回滚未提交事务。
  5. 综合:页式 + B+树 + WAL + 事务,一个最小数据库。

本节要点回顾

  1. ACID:原子性(WAL 回滚段)、一致性(约束+AID 支撑)、隔离性(锁/MVCC)、持久性(WAL fsync)。
  2. 原子性=记 before image,失败回滚;呼应编辑器撤销。
  3. 隔离性简单版=全局锁;MVCC 是高并发方案(进阶)。
  4. 持久性=commit 时 fsync 日志。
  5. SQLite 哲学:单文件、嵌入式、零配置;页式+B+树+WAL 的精巧组合。
  6. 迷你数据库综合:页式存储 + B+树索引 + WAL + 事务 = 能存查持久的最小数据库。

推荐上手顺序

  1. 实现单事务(无并发)的 BEGIN/COMMIT/ROLLBACK。
  2. 记 before image,支持回滚。
  3. COMMIT 加 fsync,实现持久性。
  4. 启动回滚未完成事务。
  5. 综合全章四块,得到迷你数据库。

至此第 8 章「造数据库」全部讲完。本章让你造一个能存、查、持久、有事务的迷你数据库,理解 SQLite/MySQL 的核心机制。下一章是登顶章——造操作系统与编译器。


发布者: 作者: 灏天文库 转发
评论区 (0)
U