fix(P2): v0.6.3 原子性/一致性/资源治理 — 8 项修复 + 12 回归
CI / test (18.x) (push) Successful in 19m13s
CI / test (20.x) (push) Successful in 18m8s
CI / test (22.x) (push) Successful in 17m18s
CI / test (24.x) (push) Successful in 22m57s
CI / e2e (push) Successful in 9m53s

- KVStore 混合写单记录原子:新增 writeBatch(put+delete 同一条日志记录),
  KVStoreEngine 全部混合写路径统一(兑现真原子宣称,崩溃无新旧行并存)
- WAL full 模式写入失败抛错(此前 console.warn 吞错 → 崩溃即丢且无感知)
- MemoryEngine SET NULL 级联索引残留:复用 removeIndexEntries(消除虚假 UNIQUE_VIOLATION)
- delete 级联两阶段:先全量 RESTRICT 预检(沿 CASCADE 链递归)再执行,无部分级联
  (Memory/Aria 对齐)
- BufferPool 驱逐同步清理 pages Map(EvictionManager onRemove 回调,内存预算真实生效)
- MVCC commit 清理已提交版本(版本链仅作事务内 undo,消除行数据双份常驻)
- LSM.flush 重复入链修复(入链即置空 immutable)+ frozenMemtables 可见性时序
- rollbackToSavepoint 重建受影响表二级索引(消除过期索引条目)

测试 1114 → 1126(71 套件);行覆盖率 89.7%;版本 0.6.3
This commit is contained in:
thzxx
2026-08-13 10:30:39 +08:00
parent ef1934a38c
commit f97c5a6001
26 changed files with 1075 additions and 250 deletions
+43
View File
@@ -2,6 +2,49 @@
All notable changes to MetonaSqlark will be documented in this file.
## [0.6.3] - 2026-08-13
### 原子性 / 一致性 / 资源治理
> 深度审计第二阶段:兑现"单记录真原子"宣称、补齐 WAL 失败可见性、
> 修复级联/索引残留/内存泄漏类问题。
### Fixed
- **KVStore 混合写非单记录原子(P2,宣称失实)** — delete/update 主键变更等路径
putMany 与 deleteMany 分两次调用 = 两条日志记录:崩溃在两条记录之间 → 新旧行并存
(主键变更产生重复行 / SET NULL 重写与父行删除不一致)。新增 `KVStore.writeBatch`
put+delete 编码进同一条日志记录,真全有或全无),KVStoreEngine 全部混合写路径
update/delete/dropTable/alterTable/clear/commitTransaction)统一走 writeBatch
- **WAL full 模式写入失败吞错(P2** — append/appendBatch 失败仅 console.warn
内存已提交而 WAL 缺失,崩溃即丢且调用方无感知。现在失败直接抛出(batch 模式
flush 早已抛错,行为对齐)
- **MemoryEngine SET NULL 级联索引残留(P2** — 手动 `pks.get(v)?.delete(pk)` 遗留
空 Set → checkUniqueness 对旧值永久误报 UNIQUE_VIOLATION(外键列带 unique 约束时)。
统一复用 removeIndexEntries(空 Set 正确清理)+ updateIndexes
- **delete 级联部分执行(P2)** — 多行删除时第 N 行 RESTRICT 抛错 → 前 N-1 行的级联
子行已删除、父行未删(无事务下数据不一致)。改为两阶段:先对全部待删行做 RESTRICT
预检(沿 CASCADE 链递归),任何违规则整体拒绝;Memory/Aria 双引擎对齐
- **BufferPool 驱逐不清理 pages MapP2** — 驱逐仅清 LRU 链表,pages Map 保留全部
历史页面 → 内存无限增长(256 页 ≈ 1MB 预算形同虚设)。EvictionManager 增加
onRemove 回调,驱逐时同步从 pages Map 移除(容量约束真实生效,重载仍正确)
- **MVCC 已提交版本不清理(P2** — commit 仅标记 committedversionStore 随写入量
无限增长(行数据双份常驻)。快照读取已移除(v0.5.1),版本链仅作事务内 undo:
commit 时直接清理本事务版本(rollback/discardVersions 语义不变,gc 保留未提交链裁剪)
- **LSM.flush 重复入链(P2** — freezeMemtable 会把同一张 immutable 再次入链 →
重复 SSTable2 行 flush 出 3 个文件);且 frozenMemtables 在链执行前被清空 →
并发读短暂看不到冻结数据。修复:入链后立即置空 immutable(防重复),
frozenMemtables 保持到链排空后再清理
- **rollbackToSavepoint 不重建二级索引(P2)** — 事务内直写索引 LSMsavepoint 回滚
只还原快照 → savepoint 之后的过期索引条目残留。回滚后重建受影响表索引
### Changed
- 测试 1114 → **1126**71 套件,+12 个 v0.6.3 回归);新增 `tests/v063-fixes.test.ts`
MVCC 语义测试同步改写(commit 清理版本、gc 裁剪未提交链)
---
## [0.6.2] - 2026-08-13
### 深度审计修复(数据正确性专项)