乐观锁插件

主要适用场景

意图:
当要更新一条记录的时候,希望这条记录没有被别人更新

乐观锁实现方式:

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

第一步:首先需要在表中添加version字段,做为乐观锁的版本号
乐观锁数据库添加版本号.png

第二步:对应的实体类要添加(version字段)版本号属性和@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 不能复用!!!`

乐观锁实体类添加版本号.png

第三步:创建Mybatis Plus配置类,启动时加载配置

/**
 * <p>
 * Description: Mybatis-plus配置类
 * </p>
 *
 * @author songzixian
 * @version v1.0.0
 * @create 2020-05-13 16:52
 * @see com.songzixian.config
 */
@EnableTransactionManagement
@Configuration
@MapperScan("com.songzixian.mapper") //在这里添加了,启动类就不需要添加了,因为作用是一样的
public class MpConfig {

    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

MyMetaObjectHandlerinsertFill方法添加上下面这段代码,可以每次增加数据时version默认数据为1(可省略,非必须)

 //乐观锁配置
 this.setFieldValByName("version",1,metaObject);

乐观锁版本号自动填充.png
测试:注意 使用乐观锁时需要先查询然后再修改才生效,去数据库对version自动看看每次修改有没有自增

/**
 * 乐观锁修改数据成功测试
 */
@RequestMapping("optimisticLock")
@ResponseBody
public String optimisticLock(Long id){
    User user = userMapper.selectById(id);
    user.setName("szxblog");

    userMapper.updateById(user);
    return "修改成功";
}

测试后分析打印的sql语句,每次修改都将version的数值进行了加1操作

乐观锁数据库添加自增版本号.png
乐观锁修改失败测试

    /**
     * 乐观锁失败
     */
    @RequestMapping("optimisticLockdefeated")
    @ResponseBody
    public String optimisticLockdefeated(Long id){
        //根据id查询
        User user = userMapper.selectById(id);
        //修改用户 无效
        user.setName("宋子宪博客");
        user.setAge(23);

        //模拟取出数据后,数据库中version实际数据比取出的值大,即已被其它线程修改并更新了version
        user.setVersion(user.getVersion() - 1);
         //会发现修改
        userMapper.updateById(user);
        return "修改成功";
    }

测试乐观锁修改测试数据库失败.png
到这里乐观锁插件就配置和使用成功了

Last modification:May 13, 2020
如果觉得这篇技术文章对你有用,请随意赞赏