MyBatis-Plus 实现乐观锁

13 min read

主要适用场景

当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新

乐观锁实现方式

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

b7ed89d95e2a4e44b8c512a450c1644d.png

悲观锁属于串行操作,对于同一条数据的修改,只有A完成了B才能操作,效率比较低

具体操作

  1. 数据库中添加version字段

  2. 实体类添加version字段

  3. 在元对象处理器接口添加version的insert默认值

public void insertFill(MetaObject metaObject) {
    ......

    this.setFieldValByName("version", 1, metaObject);
}

支持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime

整数类型下 newVersion = oldVersion + 1

newVersion 会回写到 entity 中

仅支持 updateById(id) 与 update(entity, wrapper) 方法

在 update(entity, wrapper) 方法下, wrapper 不能复用!!!

  1. 创建配置类

@Configuration
@MapperScan("com.atguigu.mpdemo1010.mapper")
public class MpConfig {

    //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

}