SpringBoot - MyBatis-Plus使用详解19(使用乐观锁进行数据更新)
作者:hangge | 2020-06-02 08:10
十九、使用乐观锁进行数据更新
1,基本介绍
(1)乐观锁的应用场景是当要更新一条记录的时候,希望这条记录没有被别人更新。
注意:
- 目前乐观锁仅支持 updateById(id) 与 update(entity, wrapper) 方法
- 在 update(entity, wrapper) 方法下,wrapper 不能复用!!!
- 取出记录时,获取当前 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,否则乐观锁无效)
提示:
- 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
- 整数类型下 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)