记录过期或重复
记录视图是某一时刻的业务投影。它可能因为异步更新、分页、筛选、重复 id 或组件双挂载而过期或重复。不要用位置或显示文本来修正,应该修正 id 与快照生命周期。
常见原因
| 原因 | 症状 |
|---|---|
| 记录 id 不稳定 | 排序后动作作用到另一行 |
| 数组 key 使用索引 | 删除后复用旧组件状态 |
| 双挂载 | 同一记录出现两次或动作执行两次 |
| 异步刷新竞态 | 旧响应覆盖新记录 |
| 快照过期 | Agent 使用已删除或已更新的记录 |
| 分页 / 虚拟列表 | 只看到当前窗口,却以为拿到全部 |
| 多标签页 | 两个页面各自维护不同状态 |
修复原则
- 记录 id 来自业务主键,不从数组位置生成。
- 每次执行前重新检查目标记录;协议层对折叠动作验证可引用 id。
- 快照与变更绑定:导航、筛选、排序、分页或写入后刷新描述。
- 一个记录一个所有者:避免两个组件同时投影同一记录。
- 分页显式暴露总数与窗口,不能静默截断。
- 异步响应带版本或取消令牌,防止旧响应覆盖新状态。
重复执行
如果用户看到一次操作产生两条记录:
- 检查前端是否双挂载;
- 检查模型是否调用了两次;
- 检查传输是否重试了已执行请求;
- 检查后端是否缺少幂等键;
- 检查协议
request.id是否被复用或被错误地当作业务幂等键。
防重放只防止同一会话 id 重放,不保证业务函数本身幂等。生产写入仍应使用数据库约束或幂等 token。
排查步骤
- 在调试面板记录前后快照与
changed.records。 - 对比记录 id、数量和更新时间。
- 检查是否有两个页面实例或两个 Agent 同时操作。
- 用只读动作确认后端真实状态。
- 若页面与后端不一致,先修复同步,再允许写入。
验收
- 排序、筛选和删除后 id 仍指向同一业务对象;
- 导航后旧记录不可调用;
- 分页响应有总数与下一页;
- 重试不会二次写入;
- 多标签页的冲突有明确策略。

