一、背景
当要更新一条记录时,希望这条记录没有被别人更新,可以考虑使用MybatisPlus乐观锁插件功能来实现以上需求。
二、乐观锁介绍
2.1 乐观锁是什么?
乐观锁是一种乐观思想,即认为读多写少,遇到并发的可能性低,所以不会上锁,但是在更新的时候判断一下在此期间别人有没有更新去更新这个数据,采取在写时先读出当前版本号,然后加锁操作
2.2 乐观锁与悲观锁的区别
## 2.3 乐观锁实现方式(版本号机制)
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
2.4 乐观锁实现方式(CAS算法实现)
三、乐观锁主要适用场景
商品锁库存
电子券领取
等等
四、基于MybatisPlus的乐观锁插件
4.1 OptimisticLockerInnerInterceptor
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
取出记录时,获取当前version
更新时,带上这个version
执行更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
4.2 具体使用步骤
4.2.1 新增注解实体字段@Version
注解实体字段@Version,
@Version
private Integer version;
4.2.2 数据库添加该字段
4.2.3 相关的代码逻辑
@ApiOperation(value = "修改商品sku")
@SysLog("修改商品sku")
@PutMapping
@PreAuthorize("@ato.hasAuthority('mall:goodssku:edit')")
public R updateById(@RequestBody GoodsSku goodsSku){
if(!goodsSkuService.updateById(goodsSku)){
return R.failed("请重新提交");
}
return R.ok(Boolean.TRUE);
}
4.2.4 说明:
- 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整数类型下 newVersion = oldVersion + 1
- newVersion 会回写到 entity 中
- 仅支持 updateById(id) 与 update(entity, wrapper) 方法
- 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!