标准答案

  1. 乐观更新使用 `WHERE id = ? AND version = ?`,成功后递增版本;影响行数为零表示版本冲突。
  2. 状态机更新要限制允许的前置状态和事件版本,旧事件、重复事件和非法事件不应覆盖新状态。
  3. 高冲突场景可按业务 Key 串行化或使用短事务锁,但仍要记录版本和审计。
  4. 冲突后的处理可以重读合并、提示用户、进入重试或补偿,不能无条件覆盖。

题目解析

乐观并发控制的关键是把“我读到的版本仍然有效”放进最终 UPDATE 的条件中。影响行数为零不是普通空结果,而是明确的版本冲突,应用必须按业务处理。

状态机还要校验当前状态、事件 ID、版本和允许的迁移,不能只把目标状态写进去。这样才能防止旧回调、重复消息和超时任务把新状态覆盖回去。

冲突处理可以重读合并、提示用户、进入重试或转人工,但不能静默覆盖。高冲突对象可以按 Key 串行化,不过最终写入的条件和唯一约束仍应保留。

常见误区

  • 误区:读取版本后无条件 UPDATE。改正:在 UPDATE 的 WHERE 中校验对象 ID、版本和前置状态,并检查影响行数。
  • 误区:冲突时静默重试覆盖别人修改。改正:重新读取并按业务合并或明确返回冲突,不能丢失并发更新。
  • 误区:状态机只校验目标状态。改正:同时校验当前状态、事件唯一性和版本,限制所有非法和倒退迁移。

作者信息