用户刚改完收货地址,第二天发现又变回旧地址,日志里同一秒有两条更新语句。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
update orders set addr=?, version=version+1 where id=? and version=?; # 返回 0 行说明已被改动
两处代码都是先查再整行更新,没有版本号也没有条件更新,后执行的那次直接把前面结果盖掉。这一点先确认清楚,后面就不用反复试。
碰到「并发更新覆盖」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
具体做法是,更新语句带上版本号或时间戳条件;受影响行数为零时重试或报冲突;非关键字段改成增量更新。
改完照着核一遍,并发压测两百次,没有出现字段被静默覆盖的情况。
