当前位置: > > > SpringBoot - MyBatis-Plus使用详解19(使用乐观锁进行数据更新)

SpringBoot - MyBatis-Plus使用详解19(使用乐观锁进行数据更新)

十九、使用乐观锁进行数据更新

1,基本介绍

(1)乐观锁的应用场景是当要更新一条记录的时候,希望这条记录没有被别人更新。
注意:
  • 目前乐观锁仅支持 updateById(id) update(entity, wrapper) 方法
  • update(entity, wrapper) 方法下,wrapper 不能复用!!!

(2)乐观锁实现方式如下:
  • 取出记录时,获取当前 version
  • 执行更新时,带上这个 version,即 set version = newVersion where version = oldVersion
  • 如果 version 不对,就更新失败

2,准备工作

(1)首先在项目中添加乐观锁插件配置:
@Configuration
public class MybatisPlusOptLockerConfig {

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

(2)接着数据库表中增加一个字段用于记录版本,我这里使用 int 类型,默认值为 0(默认值不能为 null,否则乐观锁无效)
提示:
  • 支持的数据类型只有:intIntegerlongLongDateTimestampLocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion 会回写到 entity

(3)最后在对应的实体类字段上添加 @Version 注解:
@Data
public class UserInfo {
    private Integer id;

    private String userName;

    private String passWord;

    private Integer age;

    @Version
    private Integer version;
}

3,开始测试

(1)我们先后获取同一条数据,获取后再依次修改更新:
UserInfo user1 = userInfoMapper.selectById(53);
UserInfo user2 = userInfoMapper.selectById(53);

user1.setAge(111);
if(userInfoMapper.updateById(user1) > 0 ){
    System.out.println("user1 更新成功");
} else {
    System.out.println("user1 更新失败,该记录已被其他人修改!");
}

user2.setAge(222);
if(userInfoMapper.updateById(user2) > 0 ){
    System.out.println("user2 更新成功");
} else {
    System.out.println("user2 更新失败,该记录已被其他人修改!");
}

(2)运行结果如下,可以看到第一次更新成功,第二次失败,说明乐观锁生效了:

(3)更新后数据库数据如下:

评论0