第 8 章 · 05 事务 ACID 与 SQLite 哲学 本节摘要:这是第 8 章的收尾节,讲两件事:事务的 ACID(尤其原子性与持久性的工程实现),以及参考 SQLite 的设计哲学收尾你的迷你数据库。事务保证「一组操作全做或全不做」——靠 WAL 的回滚段实现原子性,靠 fsync 日志实现持久性。SQLite 把「页式存储 + B+树 + WAL」精巧组合成单文件嵌入式数据库,你的迷你数据库可以照着这个思路收尾。 内容来源:基于数据库事务与 SQLite 设计整理的导读。 学习目标 说清 ACID:原子性、一致性、隔离性、持久性,各自的工程实现。 解释原子性如何用 WAL 的回滚段实现(事务失败则回滚已做部分)。 解释隔离性的基础(锁/MVCC 的思想,深度展开留给进阶)。
本节摘要:这是第 8 章的收尾节,讲两件事:事务的 ACID(尤其原子性与持久性的工程实现),以及参考 SQLite 的设计哲学收尾你的迷你数据库。事务保证「一组操作全做或全不做」——靠 WAL 的回滚段实现原子性,靠 fsync 日志实现持久性。SQLite 把「页式存储 + B+树 + WAL」精巧组合成单文件嵌入式数据库,你的迷你数据库可以照着这个思路收尾。
内容来源:基于数据库事务与 SQLite 设计整理的导读。
普通文件存储也能存取数据,但数据库多了「事务」——一组操作要么全成功要么全回滚。这是数据库支撑金融、订单、库存等关键业务的根本。理解 ACID 的工程实现,你才真正理解「为什么用数据库而非文件」。
事务含多条操作,若中途失败,已做的必须回滚。实现:WAL 里记「before image」(改之前的样子),失败时用 before image 撤销。呼应第 5 章编辑器的「撤销」思想——本质都是「记下反向操作」。
事务执行后,数据库仍满足约束(主键唯一、外键、CHECK)。一致性由应用层约束 + 原子性/隔离性/持久性共同保证——它更像是「目标」,由其他三个支撑。
多个事务并发执行,结果应等价于某串行顺序。实现思路:
迷你数据库可简化:全局锁(一次一个事务),保证隔离但牺牲并发。
事务一旦提交(commit),即使断电也不丢。实现:第 04 节的 WAL——commit 时 fsync 日志,日志落盘=提交成功。
BEGIN: 记事务开始 操作1: 记 before image, 改数据 操作2: 记 before image, 改数据 ... COMMIT: 写 commit 记录到 WAL, fsync → 持久性达成 # 若中途中断(未到 COMMIT): 启动时用 before image 回滚 → 原子性达成
SQLite 把整个数据库放一个文件,内含「页式存储(B+树)+ WAL」,作为库嵌入应用进程运行(无独立服务进程)。优点:零配置、单文件、跨平台、嵌入式。它广泛用在手机 App、浏览器(WebStorage/IndexedDB 底层)、桌面软件里。
你的迷你数据库照这个思路:一个文件、页式 B+树、WAL、简单事务,就是一个能用的嵌入式 KV 或表存储。
至此第 8 章「造数据库」全部讲完。本章让你造一个能存、查、持久、有事务的迷你数据库,理解 SQLite/MySQL 的核心机制。下一章是登顶章——造操作系统与编译器。