1、前言

  • **乐观锁:**就是乐观的锁。当我在操作数据时,我会认为没有任何人会干扰我的操作。也就是没有任何人会操作我正在操作的数据。然后我在需要更改我数据的时候,再来校验我的数据是否与我取出来的数据一致。通常我们会用版本号来标识。0 update 还是不是0 如果是0的话,才操作update,如果不是0,就给提示。抛异常
  • **悲观锁:**当我在操作数据时,不管有没有人正在操作这个数据,我都会认为别人要来操作我的数据。所以我会在我操作这个数据时,加上这把锁。synchronize

1-乐观锁.png

  • 使用步骤

2-乐观锁.png

5.1 实体类修改

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User implements Serializable {
    private Long id;
    private String name;
    private String password;
    private Integer age;
    private String tel;

    /**
     * 标记该字段为乐观锁字段
     */
    @Version
    private Integer version;

}

5.2 数据库中添加字段

5.3 添加乐观锁拦截器

@Configuration
public class MybatisPlusConfig {

    //定义一个方法,负责返回拦截器对象
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //创建一个MybatisPlus的拦截器对象
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        /*
          添加乐观锁拦截器
         */
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        //返回MybatisPlus的拦截器对象
        return mybatisPlusInterceptor;
    }
}

5.4 执行操作

/**
 * 乐观锁
 */
@Test
void testVersion09(){
    //模拟前端传入数据
    User data = new User();
    data.setVersion(0);
    data.setId(2L);
    data.setName("米津玄师");
    data.setAge(18);

    //修改前从数据中查询版本号
    User user = userMapper.selectById(data.getId());
    //对比版本号,如果不匹配则不允许修改
    if (user.getVersion() !=data.getVersion()){
        log.info("该数据已被修改,请刷新后重新操作!");
        return;
    }
    //如果版本号一致,则执行修改操作
    userMapper.updateById(data);
}