SuperAPI AI 工具集

transaction-correctness

数据与分析

查看项目

更新于 10-16 08:21

技能介绍

Turso 事务正确性指南

Turso 仅使用 WAL(预写日志)模式。相关文件为 .db 和 .db-wal,不存在 .db-shm——Turso 使用内存中的 WAL 索引。

WAL 机制

写入路径:写者将帧(页数据)顺序追加到 WAL 文件(顺序 I/O)。COMMIT 即头部带有非零 db_size 的帧,标记事务结束。在检查点之前,原始数据库保持不变。

读取路径:读者获取读标记(mxFrame = 最后一个有效提交帧)。对每个页,先在 WAL 中查找到 mxFrame,再回退到主数据库。读者在其读标记处看到一致的快照。

检查点

检查点将 WAL 内容传回主数据库。WAL 增长后触发检查点(默认 1000 页),页被复制到数据库,WAL 被复用。

检查点类型:

PASSIVE:非阻塞,在活跃读者所需的页处停止

FULL:等待读者,检查点全部内容

RESTART:类似 FULL,并将 WAL 重置到开头

TRUNCATE:类似 RESTART,并将 WAL 文件截断为零长度

WAL-Index

SQLite 使用共享内存文件(-shm)作为 WAL 索引。Turso 不使用该文件,而是采用内存数据结构(frame_cache 哈希表、原子读标记),因为不支持多进程访问。

并发规则

一次仅一个写者。读者不阻塞写者,写者也不阻塞读者。检查点必须在活跃读者所需的页处停止。

恢复

崩溃时:第一个连接获取排他锁,重放 WAL 中的有效提交,释放锁,恢复正常操作。

Turso 实现

关键文件包括 WAL 实现、页管理、事务。

连接私有与共享

每连接(私有):Pager——页缓存、脏页、保存点、提交状态。WalFile——连接的快照视图,包含 max_frame / min_frame(本连接快照的帧范围)、max_frame_read_lock_index(本连接持有的读锁槽位)、last_checksum(滚动校验和状态)。

跨连接共享:WalFileShared——全局 WAL 状态,包含 frame_cache(页到帧的索引,替代 .shm 文件)、max_frame / nbackfills(全局 WAL 进度)、read_locks[5](读标记槽位,带内嵌帧值的 TursoRwLock)、write_lock(排他写者锁)、checkpoint_lock(检查点串行化)、file(WAL 文件句柄)。此外还有 DatabaseStorage(主 .db 文件)和 BufferPool(共享内存分配)。

正确性不变量

持久性:返回成功前,COMMIT 记录必须已 fsync。

原子性:部分事务对读者永不可见。

隔离性:每个读者看到一致快照。

无丢失更新:检查点不能覆盖未提交的更改。

参考:SQLite WAL、WAL 文件格式。