记一次数据库更新丢失问题以及解决方案

前言

最近在项目中出现了更新数据库偶尔更新丢失的情况,表现为SQL执行成功,没有任何报错,在同一事务中查询保存后的记录,没有任何问题,然而查看数据库记录却没有更新。重点是这种情况并不是稳定发生的,有时能够更新成功,又是却会更新丢失。

原因

经过几天的排查,发现原因是有两个接口对待更新的表都进行了更新操作。
接口A会先查询记录保存到浏览器,并在修改部分数据后,以提交整个对象的方式进行更新。
接口B只更新单个字段。
假设表中有字段x,其中有初始值1,那么接口A会先查询到浏览器,此时浏览器中的x的值为1,在修改x字段以外的字段的值后提交整个对象到接口。接口B的行为只会将x字段的值更新为2。那么在这两个接口并发调用的时候如果接口B的调用先于接口A,当B把值更新2后,接口A接受的对象中x字段的值仍然是1,所以更新时又把x的值更新回了1,造成了一种更新丢失的假象。

解决方案

前端

按顺序调用接口,先调用A,再调用B

后端

修改A接口,由于A接口不需要修改字段x,可以阻止A接口修改字段x

记一次数据库更新丢失问题以及解决方案

https://jktu.cc/记一次数据库更新丢失问题以及解决方案/

作者

udp_bbr

发布于

2023-02-21

更新于

2023-02-21

许可协议