MyBatisPlus-乐观锁

MyBatisPlus-乐观锁

为了解决业务并发现象带来的问题:秒杀。

乐观锁案例

  1. 数据库表中添加锁标记字段version

  2. 实体类中添加对应字段,并设定当前字段为逻辑删除标记字段

    public class User {
      private Long id;
      @Version
      private Integer version;
    }
    
  3. 配置乐观锁拦截器实现锁机制对应的动态SQL语句拼装

    @Configuration
    public class MapConfig {
        @Bean
        public MybatisPlusInterceptor mpInterceptor(){
            // 1. 定义Mp拦截器
            MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
            // 2. 添加具体的拦截器
            mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
            // 3. 添加乐观锁拦截器
            mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
            return mpInterceptor;
        }
    }
    
  4. 使用乐观锁机制在修改前必须先获取到对应数据的version方可正常进行

    @Test
    void testUpdate(){
      // User user = new User();
      //  user.setId(3L);
      // user.setName("Jock666");
      // user.setVersion(1);
      // userDao.updateById(user);
      // 1. 先通过要修改的数据id将当前数据查询出来
      User user = userDao.selectById(3L);
      // 2. 将要修改的属性逐一设置进去
      user.setName("Jock888");
      userDao.updateById(user);
    }
    

    执行修改前先执行查询语句:

    SELECT id, name, age, tel, deleted, version FROM tbl_user WHERE id=?
    

    执行修改时使用version字段作为乐观锁检查依据

    UPDATE tbl_user SET name=?, age=?, tel=?, version=? WHERE id=? AND version=?