更新丢失问题在高并发时特别容易出现,不知道你的项目中有没有考虑这个问题,这个问题一旦出现,会造成比较严重的BUG,不容易调试,只能一步一步看日志。下面的场景就会出现更新丢失问题:
更新丢失问题.png上面的情况是客户端的提交具有明显的时间差异,如果提交的时间间隔很短,那么谁的更新是有效的就取决于谁的网络慢了,因为前面的修改会被后者覆盖掉,那么如何解决这个问题呢?目前我想到以下几种方案。
1. 基于“修改时间”的校验
客户端每次获取资源时,服务端返回资源+getTime。客户端提交时带上getTime,服务端先校验当前记录的 updateTime 和 getTime,如果 updateTime 大于 getTime,说明中间有修改,需要重新获取。
2. 基于“ETAG”的校验
客户端每次获取资源时,服务端返回资源+ETAG(资源的散例值),客户端提交时带上ETAG,服务端从当前记录中查询数据,并计算新的ETAG,如果不一致,则中途有更新,客户端需要重新获取。这个方案类似 HTTP 协议中的 ETAG。
3. 方案比较
- 局部更新:比如更新 mysql 表中某一条记录的部分字段
- 全局更新:比如更新 mysql 表中某一条记录的所有字段,或者不需要区分。
- 第一种方案,不管是全局更新或者局部更新,都可以使用,但是局部更新无法做到精细
- 第二种方案,局部更新时更实用,计算etag时,只需要计算所关注的几个字段
网友评论