MyBatis-Plus 插件篇 >乐观锁插件

目标:

懂得使用 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 );
    }

执行结果

请添加图片描述

请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值