SpringBoot整合Mybatis-Plus 乐观锁的实现

1:乐观锁简介

乐观锁:总是假设最好的情况,在读取数据的使用不会发生并发问题,但在更新的时候比较原数据是否被其他线程发生了改变。主要通过通过版本号机制或CAS算法实现,适用于读多写少的应用场景。

版本号机制:在数据库表中加一个版本号version字段,表示数据被修改的次数,在修改数据前先读取该表中的版本号字段,在修改的使用对比是否是自己读取出来的版本号如果是则进行更新操作并版本号(version)加1如果不是则重新执行进行更新操作直到更新成功为止。.2:乐观锁的例子

2:乐观锁的例子

未使用乐观锁(实现存钱取钱)

A操作人员 B操作人员
查询余额(100¥) 查询余额(100¥)
存入10¥(100¥+10¥) 喝咖啡中
喝咖啡中 取出10¥(100¥-10¥)
查询余额 (90¥) 喝咖啡中
查询余额 (90¥) 查询余额 (90¥)

以使用乐观锁(实现存钱取钱)

A操作人员 B操作人员
查询余额(100¥)version=1 查询余额(100¥)version=1
存入10¥(100¥+10¥)把查询余额中的version进行对比匹配version+1充值成功 喝咖啡中
喝咖啡中 取出10¥(100¥-10¥)把查询余额中的version进行对比,结果不匹配 ,取出不成功,重新进行取钱操作,查询余额(110¥)version=2,把查询余额中的version进行对比匹配version+1取出成功 (110¥-10¥)
查询余额 (100¥) 喝咖啡中
查询余额 (100¥) 查询余额 (100¥)

3:springboot整合mybatisPlus 乐观锁插件

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
    return interceptor;
}

    在实体类的字段上加上@Version注解

@Version
private Integer version;

说明:

  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion 会回写到 entity 中
  • 仅支持 updateById(id) 与 update(entity, wrapper) 方法
  • 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!

你可能感兴趣的:(SpringBoot,java,开发语言)