SuperAPI AI 工具集

mvcc

数据与分析

查看项目

更新于 10-16 07:21

技能介绍

MVCC(多版本并发控制)是 Turso 中一项实验性功能,官方标注为进行中、尚未达到生产可用水平。调试时除非缺陷与 MVCC 直接相关,否则应忽略它。

启用方式为运行时配置,而非编译期特性开关,且按数据库单独设置:PRAGMA journal_mode = 'mvcc';

与标准 WAL 的差异:WAL 每页只有单一版本,读者在读取标记时刻看到快照;MVCC 维护多个行版本并提供快照隔离,每个事务在开始时看到一致快照。写入粒度上,WAL 每次提交写入完整页面,MVCC 只写受影响的行;两者读者与写者都互不阻塞;持久化文件分别是 .db-wal 和 .db-log(逻辑日志);隔离级别分别为页面级快照与行级快照。每个行版本记录 begin(可见时间戳)、end(删除或替换时间戳)以及 btree_resident(是否在启用 MVCC 前已存在)。

架构上,数据库层包含 mv_store(MvStore),其内有 rows(RowID 到行版本向量的 SkipMap)、txs(TxID 到事务的 SkipMap)、Storage(.db-log 文件)和 CheckpointStateMachine。每个连接通过 mv_tx 跟踪当前 MVCC 事务,MvStore 则共享使用无锁的 crossbeam_skiplist 结构。关键文件包括 core/mvcc/mod.rs、core/mvcc/database/mod.rs(主实现,约 3000 行)、core/mvcc/cursor.rs(合并的 MVCC 与 B-tree 游标)、core/mvcc/persistent_storage/logical_log.rs(磁盘格式)和 core/mvcc/database/checkpoint_state_machine.rs(检查点逻辑)。

检查点会周期性把行版本刷入 B-tree,阈值通过 PRAGMA mvcc_checkpoint_threshold = <pages>; 配置。流程为:获取锁 → 开始 pager 事务 → 写入行 → 提交 → 截断日志 → fsync → 释放。

当前限制:尚未实现垃圾回收(旧版本会累积)和重启后从逻辑日志恢复。已知问题包括检查点会阻塞其他事务,甚至读取操作;不支持溢写到磁盘,存在内存占用隐患。

测试方面,可运行 cargo test mvcc 执行 MVCC 专用测试,或使用 make test-mvcc 运行启用 MVCC 的 TCL 测试;测试函数可使用 #[turso_macros::test(mvcc)] 属性。core/mvcc/mod.rs 还记录了脏读、丢失更新等数据异常;MVCC 提供的是快照隔离而非可串行化。