目标:
懂得使用 Mybatis-Plus的乐观锁
实现步骤:
1、创建配置类2、实体类属性加上@Version注解
🔒当要更新一条记录的时候,希望这条记录没有被别人更新,我们通常会加锁
!于是乐观锁
就出现了~
一、乐观锁实现方式:跟我们之前学习JUC并发编程一样,带版本号 ~
1. 取出记录时,获取当前 version
(版本号)
2. 更新时,带上这个 version
(版本号)
3. 执行更新时(sql为), set version = newVersion where version = oldVersion
4. 如果 version
(版本号) 不对,就更新失败
二、 官网有
两种配置乐观锁的方式
,一种是原生Spring的,还有一种是SpringBoot的,我们案例所演示的都是SpringBoot ~
步骤一:创建一个配置类MybatisPlusConfig
@Configuration
public class MybatisPlusConfig {
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
Tips:可以看到代码中标注为旧版,新版代码如下
如果要使用新版,请将MyBatis-Plus
的依赖提高,同时,高版本 不适用于 老版本,所以之前的老版本代码会报错
启动类扫描Mapper文件夹时,需加上此配置类
步骤二:在实体类的字段上加上@Version注解
那么首先我们需要修改数据库字段,才能和实体类字段 一 一对应
设计后表数据如下:
接下来修改实体类属性
步骤三:测试更新
@Test
void testUpdateVersion(){
// 先查询出 想要的用户
User user = userMapper.selectById(1491710152594796547L);
// 执行一系列的修改
user.setName("change");
// 更新回去
int res = userMapper.updateById(user);
System.out.println(res);
}
执行结果
模拟一下并发过程 线程A拿到此数据,在还没执行更新操作时,被线程B抢先一步更新,结果线程A 更新失败,线程B更新成功
@Test
void testUpdateVersionAB(){
// 线程A 先查询出 想要的用户
User A = userMapper.selectById(1491710152594796547L);
// 线程A 执行一系列的修改
A.setName("change By A");
// 线程B 先查询出 想要的用户
User B = userMapper.selectById(1491710152594796547L);
// 线程B 执行一系列的修改
B.setName("chang By B");
// 更新回去
int resB = userMapper.updateById(B);
int resA = userMapper.updateById(A);
System.out.println("B修改结果:"+resB );
System.out.println("A修改结果:"+resA );
}