美文网首页
MyBatis-Plus乐观锁插件的使用

MyBatis-Plus乐观锁插件的使用

作者: 文景大大 | 来源:发表于2021-06-27 15:26 被阅读0次

乐观锁是为了解决应用多实例,数据库单一实例时,并发修改同一条记录可能造成的并发问题。一般来说,乐观锁的实现方案都是:

  • 首先自己实现查询需要修改记录的当前版本version;
  • 后续需要更新该记录时带上刚才的版本号;
  • mybatis-plus执行SQL更新时以版本号version为一个匹配条件,并自动把version值增加;
  • 只有version为刚才查询出来的值时才证明这期间没有其它服务更改过,才能更改成功;

代码示例很简单:

  1. 增加Mybatis-Plus的配置,添加乐观锁拦截器;

    @Configuration
    public class MybatisPlusConfig {
    
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor(){
            MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
            mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
            return mybatisPlusInterceptor;
        }
    
    }
    
  2. 实体类需要增加version字段,建议采用Integer或者Long类型;并且加上@Version注解。

    @Data
    @TableName("zx_course")
    public class Course {
    
        @TableId(type = IdType.ASSIGN_ID)
        private String courseId;
        private String courseName;
        @Version
        private Long version;
    
    }
    
  3. 数据库表增加相应的version字段,对应为bigint类型,非空,缺省默认为1;

    ALTER TABLE zhangxun.zx_course ADD version BIGINT DEFAULT 1 NOT NULL;
    
  4. 编写controller

    // 更新操作
    @PostMapping("/updateCourse")
    public Integer updateCourse(@RequestBody Course course){
        // 入参course:version=1,模拟更新前查到了version
        QueryWrapper<Course> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("course_id", course.getCourseId());
        // UPDATE zx_course SET course_name=?, version=? WHERE (course_id = ? AND version = ?)
        return courseMapper.update(course, queryWrapper);
    }
    

    如果当前version为1,执行后就会发现version被更新为了2。

    官网文档强调,当version为整数类型时,自动采用自增+1的操作去更新version。且仅限updateById和update两个方法才有效。

相关文章

网友评论

      本文标题:MyBatis-Plus乐观锁插件的使用

      本文链接:https://www.haomeiwen.com/subject/rkiwyltx.html