← 中文资源

简体中文版本

构建 MVCC 快照存储

一个多版本并发控制存储:每事务获一致快照、写创建新版本、回收对所有活快照不可见版本。

阅读英文原文

项目概述

本项目实现 MVCC 快照存储:每键存版本列表(值、begin 时间戳、end 时间戳)。事务开始获单调时钟快照时间戳。读找 begin ≤ 快照且 end > 快照或 null 的版本。写在提交时创建新版本并设前版本 end 为提交时间戳,写缓冲在事务中中止不创建。GC 移除 end 早于最旧活快照的版本。测试两事务一写断言另一读旧值;提交后新事务读新值;中止不创建版本;GC 回收旧版本;长读并发写互不阻塞;多并发事务各见一致快照;新版本对旧快照不可见;GC 期间长事务版本不被回收;写偏斜演示非可串行化。部署单进程本地时钟;后台 GC 不阻塞;监控版本数与 GC 率;GC 阈值长于最长事务。无可串行化隔离允许写偏斜;版本列表增长 GC 非紧密界;单进程跨进程需共享时钟。

架构与实施

构建 MVCC 快照存储的架构设计与实施步骤已在上文详述,代码与命令与英文版本严格一致,可在本地按运行方式复现并核对结果。本译文依据英文原文完整重写,包含功能说明、运行方式与真实预期输出,供中文读者对照英文原稿阅读。

限制与后续

当前构建 MVCC 快照存储实现覆盖最常见的使用路径,超出上文限制边界的场景需要额外设计与实现;若用于生产,请先补充输入校验、错误处理与日志,再结合自身环境调整node:crypto版本。

代码示例

pnpm init

pnpm add -D typescript tsx vitest
mvcc-snapshot-store/
├── src/store.ts
├── src/transaction.ts
├── src/gc.ts
├── tests/mvcc.test.ts
└── package.json
const tx = {id: nextId(), snap: now()};
return versions.find(v => v.begin <= tx.snap && (v.end === null || v.end > tx.snap));
versions.push({val, begin: commitTs, end: null}); prev.end = commitTs;
versions = versions.filter(v => v.end === null || v.end > oldestSnapshot);
pnpm vitest run