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

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

作者: 菜鸡前端 | 来源:发表于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、使用乐观锁避免更新丢失问题

相关文章

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

    更新丢失问题在高并发时特别容易出现,不知道你的项目中有没有考虑这个问题,这个问题一旦出现,会造成比较严重的BUG,...

  • 【链安】竞态条件漏洞分析及详细修复建议

    什么是竞态条件 【竞态条件】竞态条件的官方定义是如果程序的执行顺序改变会影响结果,它就属于一个竞态条件。在智能合约...

  • 线程安全与资源共享

    允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。当多个线程同时更新共享资源时会引发竞...

  • java并发的资源

    允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。当多个线程同时更新共享资源时会引发竞...

  • 竞态条件和临界区

    当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。

  • 竞态与死锁的理解

    1、竞态条件: 定义:竞态条件指的是一种特殊的情况,在这种情况下各个执行单元以一种没有逻辑的顺序执行动作,从而导致...

  • 【Golang】竞态条件 (Race Conditions)

    欢迎关注微信公众号:全栈工厂 1. 什么是竞态条件? 竞态条件是指在并发环境中,当有多个事件同时访问同一个临界资源...

  • 什么是竞态条件?

    如果程序运行顺序的改变会影响最终结果,这就是一个竞态条件(race condition)。 例如:两个线程执行下面...

  • JUC(02)--》Atomicxxx前奏:竞态条件-竞态数据-

    热门话题volatile 变量的++ 操作不是线程安全的实例验证一下 *结果: set和map里的元素是不连续的有...

  • Java并发

    无状态对象一定是线程安全的 竞态条件当某个计算的正确性取决于多个线程的交替执行时序时,那么久会发生竞态条件。换句话...

网友评论

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

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