两个人同时修改同一条业务记录,怎样避免后保存覆盖先保存
保存时要检查用户编辑所依据的版本是否仍有效。出现冲突后保留待提交内容,重新读取最新记录,再按字段关系决定合并或重新办理,不能静默覆盖同事的结果。
阅读目录5 个章节
两个人编辑同一条记录,避免覆盖的关键是保存时校验“用户从哪个版本开始修改”。若记录已变化,系统应保留本次输入并告知冲突,不能仍显示保存成功。建议将冲突识别、差异展示、重新确认和再次保存写入软件开发范围,分别验证后台写入与页面反馈。
用两次保存还原问题
假设甲、乙都打开版本 12 的采购记录。甲修改收货地址并保存为版本 13;乙随后修改联系人,却把打开时的整份旧表单提交。若后台无条件覆盖,地址可能被写回旧值。即使两人修改不同字段,整表提交仍可能丢失先前修改。
这里的版本应由服务端产生和检查,不建议依赖浏览器本地时间判断先后。Microsoft EF Core 文档提供了写入时比较原始并发标记的机制;HTTP If-Match也可用于条件写入,不满足条件时返回 412。这些是技术手段,具体业务仍要定义冲突后怎么办。
整条拦截还是字段合并,取决于字段关系
建议先采用容易说明和核验的规则:关键记录变化就要求重新确认。只有明确互不影响的字段,才考虑自动合并。数量和单价、仓库和库存占用、审批状态和可修改范围虽然是不同字段,却可能共同决定一项业务,不能按“字段名不同”直接合并。
| 变化情形 | 建议处理 | 需要业务确认 |
|---|---|---|
| 双方改了同一字段 | 展示差异,人工选择或重新填写 | 谁有权决定最终值 |
| 双方改了独立说明字段 | 可评估合并,但保留修改记录 | 字段是否真正独立 |
| 状态或关键关联已变化 | 重新判断当前动作是否允许 | 能否继续原操作 |
冲突页面需要保留三组信息
建议展示用户开始编辑时的值、当前已保存的值和本次待提交的值,并突出实际差异。最新值应按用户当前权限读取,不能借冲突提示泄露已撤权字段。选择重新载入时,应先说明未提交输入将如何处理,避免为保护同事修改却丢掉自己的长段文字。
用户完成合并后,系统仍须依据刚读取的最新版本执行条件保存。比较和写入应在服务端作为受保护的操作执行;仅在提交前查询一次再无条件保存,仍会留下另一人插入修改的间隙。若再次冲突,保留本次选择并重新核对,不能悄悄自动变成强制覆盖。
有些冲突不能靠选一个值解决
在乙编辑期间,单据可能已审批、被删除或转交其他部门。此时应区分“内容变化”和“原动作已经不允许”。例如已关闭工单不能通过合并备注之外的旧字段重新打开;需要重新开启业务流程时,应另走有权限的操作。
强制覆盖若确有业务需求,应单独限制角色、说明覆盖范围并留记录,不能作为普通保存失败后的默认按钮。输入保留、权限变化和删除后的去向,可按需求文档的前置条件与异常分支写清楚,避免只交付一个笼统的“数据已更新”提示。
验收要控制操作顺序,再检查实际数据
- 两个账号打开同一版本,先后修改同一字段,确认后保存被识别且先保存值未丢失。
- 改不同字段,核对约定的整条拦截或合并规则,而非只看成功提示。
- 在冲突处理过程中第三次修改记录,确认第二次提交仍有版本保护。
- 编辑期间审批、删除或撤权,确认旧页面不能绕过当前业务限制。
记录打开版本、提交顺序、预期数据和最终数据,纳入业务用户验收。若某类记录频繁冲突,再评估短时占用或编辑锁;新增锁时还要验收离开页面、断线、超时和管理员释放,不能为了避免覆盖,让记录长期无人可改。