thzxx
89243ef6eb
fix(A3/A4): SAVEPOINT 语义根治 —— 已回滚的行不再复活、陈旧保存点不再吞写入
A3 已回滚的行在崩溃重启后复活(静默数据错误)
`ROLLBACK TO <savepoint>` 只改内存快照、**不写 WAL**,而 COMMIT 会把整个 txnId
标记为已提交,恢复时按"该事务的全部记录"重放 → 被回滚掉的写入被重新应用。
实测:事务内插入 a、savepoint、插入 b、回滚到 savepoint、提交 →
实时只剩 a,崩溃重开变成 a+b。
根治:新增 WALRecordType.SAVEPOINT_ROLLBACK(走既有 data 字段携带
{ replayFromIndex } 边界,二进制格式不变、旧库记录仍可解析)。
- 写入侧:savepoint() 记录"该事务当时已追加的记录条数";rollbackToSavepoint()
先写标记再改内存(与 commit/rollback 的"WAL 领先内存"一致)。
- 恢复侧:按**事务内**下标计算窗口 —— 保留 [0, keepUpTo),丢弃
[keepUpTo, 最后一个标记),标记之后的记录照常保留。
注意不能拿全局下标比较:全局数组里混有 txnId=0 的非事务记录(CREATE_TABLE
等)与其它事务的记录。这个差一错误在实现过程中被测试抓出并修正。
- 事务内 WAL 记录计数(txnWalRecordCount)在 5 个 appendBatch 站点与 BEGIN
处维护,事务开始/结束时归零。
A4 跨事务复用的陈旧 savepoint 静默丢弃当前事务的写入
savepoints 在 commit/rollback 时**从不清空**,且 rollbackToSavepoint 不校验归属。
实测:上一个事务遗留 savepoint 名 → 新事务 update 后 ROLLBACK TO 该名 + COMMIT,
写入凭空消失(v=5 被回退成 v=9)。
根治:事务结束清空 savepoints 与边界表;rollbackToSavepoint 校验
sp.txnId === currentTxnId,陈旧保存点抛 SAVEPOINT_NOT_FOUND。
新增 tests/v080-savepoint.test.ts(4 个用例):包含"崩溃重放一致性"、
"普通事务不得误伤"、以及"多个保存点回到最早"的语义护栏。
2026-09-14 21:53:46 +08:00
..
2026-09-14 21:03:06 +08:00
2026-09-14 21:43:21 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:43:21 +08:00
2026-08-14 22:53:46 +08:00
2026-07-26 15:00:01 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:08:20 +08:00
2026-09-14 21:03:06 +08:00
2026-07-26 15:00:01 +08:00
2026-09-14 21:03:06 +08:00
2026-07-26 16:40:11 +08:00
2026-07-26 15:00:01 +08:00
2026-08-10 13:56:04 +08:00
2026-07-26 15:00:01 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-07-26 15:00:01 +08:00
2026-09-14 21:03:06 +08:00
2026-08-14 22:53:46 +08:00
2026-08-13 15:31:16 +08:00
2026-08-10 13:56:04 +08:00
2026-09-14 21:03:06 +08:00
2026-08-10 14:11:44 +08:00
2026-09-14 21:03:06 +08:00
2026-07-26 16:40:11 +08:00
2026-08-10 14:11:44 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:08:20 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-08-13 09:51:26 +08:00
2026-08-13 10:30:39 +08:00
2026-08-13 10:57:26 +08:00
2026-08-13 11:14:42 +08:00
2026-08-13 15:31:16 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:03:06 +08:00
2026-09-14 21:53:46 +08:00
2026-09-14 21:03:06 +08:00