Undo/Redo 设计
概述
Undo/Redo 功能基于 RxDBChange 变更记录实现,通过 inversePatch 和 patch 字段记录每次变更的逆向和正向操作,从而支持撤销和重做功能。
开发状态
本功能已在 VersionManager 和 HistoryManager 中实现核心逻辑。
核心原则
本节描述 Undo/Redo 功能的 4 个核心设计原则,这些原则确保了功能的正确性、一致性和可预测性。
1. 时间边界限制
只能撤销 RxDB 初始化之后的数据变更。
- RxDB 初始化之前的历史数据无变更记录,无法追踪和还原
- 系统记录 RxDB 初始化时间作为 undo/redo 操作的起始边界
- 确保所有可撤销的操作都有完整的变更日志支持
2. 事务完整性
事务中的所有操作必须作为一个整体进行 undo/redo。
- 通过
transactionId字段标识同一事务中的多个变更 - 撤销时:必须同时撤销该事务中的所有变更,保持数据一致性
- 重做时:必须按照原始顺序恢复所有变更,避免状态错乱
3. 状态标记机制
通过 revertChangeId 和 revertChangedAt 两个字段追踪变更的撤销状态。
变更记录通过这两个字段的组合,可以清晰区分三种状态:
状态组合矩阵
revertChangeId | revertChangedAt | 状态说明 | 是否生效 |
|---|---|---|---|
null | null | 正常生效,从未被撤销 | ✅ 生效 |
| 非 null | 非 null | 已撤销,当前未生效 | ❌ 失效 |
| null | 非 null | 已恢复,曾被撤销过 | ✅ 生效 |
字段作用说明
revertChangeId(撤销标记)
null:变更当前生效- 非
null:变更已被撤销,不生效 - Undo 时设置为
当前序列值 + 1(预留序列号) - Redo 时清除为
null(恢复生效)
revertChangedAt(审计时间戳)
null:从未被撤销- 非
null:记录首次被撤销的时间 - Undo 时设置,Redo 时保留(审计历史)
- 通过此字段可查询所有曾被撤销的变更