SpringBoot - MyBatis-Plus使用详解19(使用乐观锁进行数据更新)
十九、使用乐观锁进行数据更新
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)更新后数据库数据如下: