目标:
懂得使用 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 );
}
执行结果


本文详细介绍了如何在SpringBoot项目中利用Mybatis-Plus的乐观锁机制,包括配置乐观锁拦截器、在实体类中添加版本号字段,并通过示例展示了并发更新时的乐观锁应用和可能的结果。
664

被折叠的 条评论
为什么被折叠?



