代码里靠影响行数判断是否更新成功,用户重复提交时返回失败,实际数据没有变化。日志里能对上时间点,这种反而好排。
默认返回的是实际变更行数,新旧值相同时计为 0,与匹配行数不同。这一点先确认清楚,后面就不用反复试。
mysql --client-flag SELECT ROW_COUNT(); -- JDBC -- useAffectedRows=true 时按匹配行返回
「MySQL 影响行数」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
处理上按这个顺序:用匹配行数判断是否存在;或先查后改避免误判;驱动里开启对应参数。
结果对不对很好判断,重复提交不再被判为失败,更新逻辑与业务预期一致。