乐观锁


设想这么一个场景,我们需要对一条商品库存数据进行更新,做一个库存-1的操作。

假设目前库存100,有A,B两个人同时进行操作。

理论上来说,最终结果应该是98,然而实际情况有可能不是。

如果A操作的事务还没有提交,B这时从数据库读出来的库存还是100,然后B也进行-1操作,那最终两人操作完的结果是99。

我们希望更新一条数据的时候,这条数据没有被别人更新,这时可以利用乐观锁来实现。

乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

首先数据库表需要新增一个表示版本的字段,假设我们增加一个int字段如version

在实体类中对应的字段上加上注解:

@Version
private Integer version;

这时我们调用updateById或者update(entity, wrapper)方法,假设当前version字段的值为2:

user.setName("张三");
userService.updateById(user);

实际sql效果:

update user set name = '张三',version = 3 where id = 1 and version = 2