美文网首页
更新丢失问题(竞态条件)

更新丢失问题(竞态条件)

作者: 菜鸡前端 | 来源:发表于2021-09-06 11:02 被阅读0次

    更新丢失问题在高并发时特别容易出现,不知道你的项目中有没有考虑这个问题,这个问题一旦出现,会造成比较严重的BUG,不容易调试,只能一步一步看日志。下面的场景就会出现更新丢失问题:

    更新丢失问题.png

    上面的情况是客户端的提交具有明显的时间差异,如果提交的时间间隔很短,那么谁的更新是有效的就取决于谁的网络慢了,因为前面的修改会被后者覆盖掉,那么如何解决这个问题呢?目前我想到以下几种方案。

    1. 基于“修改时间”的校验

    客户端每次获取资源时,服务端返回资源+getTime。客户端提交时带上getTime,服务端先校验当前记录的 updateTime 和 getTime,如果 updateTime 大于 getTime,说明中间有修改,需要重新获取。

    2. 基于“ETAG”的校验

    客户端每次获取资源时,服务端返回资源+ETAG(资源的散例值),客户端提交时带上ETAG,服务端从当前记录中查询数据,并计算新的ETAG,如果不一致,则中途有更新,客户端需要重新获取。这个方案类似 HTTP 协议中的 ETAG。

    3. 方案比较

    • 局部更新:比如更新 mysql 表中某一条记录的部分字段
    • 全局更新:比如更新 mysql 表中某一条记录的所有字段,或者不需要区分。
    • 第一种方案,不管是全局更新或者局部更新,都可以使用,但是局部更新无法做到精细
    • 第二种方案,局部更新时更实用,计算etag时,只需要计算所关注的几个字段

    4. 参考文档

    1、使用乐观锁避免更新丢失问题

    相关文章

      网友评论

          本文标题:更新丢失问题(竞态条件)

          本文链接:https://www.haomeiwen.com/subject/mceewltx.html