跳到主要内容

Undo/Redo 设计

概述

Undo/Redo 功能基于 RxDBChange 变更记录实现,通过 inversePatchpatch 字段记录每次变更的逆向和正向操作,从而支持撤销和重做功能。

开发状态

本功能已在 VersionManagerHistoryManager 中实现核心逻辑。

核心原则

本节描述 Undo/Redo 功能的 4 个核心设计原则,这些原则确保了功能的正确性、一致性和可预测性。

1. 时间边界限制

只能撤销 RxDB 初始化之后的数据变更。

  • RxDB 初始化之前的历史数据无变更记录,无法追踪和还原
  • 系统记录 RxDB 初始化时间作为 undo/redo 操作的起始边界
  • 确保所有可撤销的操作都有完整的变更日志支持

2. 事务完整性

事务中的所有操作必须作为一个整体进行 undo/redo。

  • 通过 transactionId 字段标识同一事务中的多个变更
  • 撤销时:必须同时撤销该事务中的所有变更,保持数据一致性
  • 重做时:必须按照原始顺序恢复所有变更,避免状态错乱

3. 状态标记机制

通过 revertChangeIdrevertChangedAt 两个字段追踪变更的撤销状态。

变更记录通过这两个字段的组合,可以清晰区分三种状态:

状态组合矩阵

revertChangeIdrevertChangedAt状态说明是否生效
nullnull正常生效,从未被撤销✅ 生效
非 null非 null已撤销,当前未生效❌ 失效
null非 null已恢复,曾被撤销过✅ 生效

字段作用说明

revertChangeId(撤销标记)

  • null:变更当前生效
  • null:变更已被撤销,不生效
  • Undo 时设置为 当前序列值 + 1(预留序列号)
  • Redo 时清除为 null(恢复生效)

revertChangedAt(审计时间戳)

  • null:从未被撤销
  • null:记录首次被撤销的时间
  • Undo 时设置,Redo 时保留(审计历史)
  • 通过此字段可查询所有曾被撤销的变更