关系型数据库Write-Ahead Logging
WAL 模式 是什么?
写操作先追加到 -wal 文件,读不受写阻塞
类比:先在便签上记账,之后再合并进正式账本
默认模式的问题
默认的 rollback journal 模式下,写事务会锁住整个数据库,读操作要等写完成。单机小工具无所谓,稍微有点并发就会看到 `database is locked`。
WAL 怎么改善
开启后(`PRAGMA journal_mode=WAL;`),写操作追加到 -wal 文件,读连接继续读主文件里的旧数据,读写互不阻塞。多个读 + 一个写可以真正并发。
代价是多两个文件(-wal、-shm),并且 WAL 需要定期 checkpoint 合并回主文件。
实践建议
几乎所有的服务端 / 桌面应用都该开 WAL。配合 `PRAGMA synchronous=NORMAL` 能显著提升写吞吐(崩溃可能丢最后几条事务,但不会损坏数据库)。批量写入一定包事务,否则每条都是一次 fsync。