场景:
页面上有保存、提交两个操作
保存的逻辑:查询当前数据,如果之前保存过,则更新
提交的逻辑: 查询当前数据,更新数据状态,记录日志
现象:
提交操作执行之后,数据状态没有更新,但是日志记录成功了
原因:
通过查询请求日志发现,人员在很短的时间内同时操作了保存和提交操作,mysql隔离级别(RR)每个操作都有事务控制,RR隔离级别下,查询的数据为快照,当提交的操作先执行完,但是保存是的快照是提交操作执行之前的快照,当保存操作事务提交之后,将提交的变更覆盖,导致了数据状态没变,但是日志却记录成功。更新语句为动态生成sql,全字段更新
解决:
前端页面增加防重,在操作保存时,禁止操作提交
后端尽量避免全字段更新