mybatis-plus自带的乐观锁


mysbatis-plus乐观锁原理:
mysbatis-plus进行修改操作时,会将数据库中version字段的值拿出来和上一个查询时的得到的version值做对比,如果两个值相同则执行修改操作。若不相同,不执行修改操作。

1.场景

	阎王看孙悟空能活500岁很不爽,让判官甲给孙悟空削去400岁。
	过了一会阎王感觉削多了,让判官乙再去给加上孙悟空加上300岁,只削孙悟空100岁就行了。 
	没想到判官甲偷懒了,和判官乙近乎同时操纵的生死簿。
	这样甲拿出来是500岁,乙拿出来也是500岁。
	甲拿的500岁减去400岁变为100岁存入数据库,乙拿的500岁加上300岁变为800岁存入生死簿。
	没错判官甲的操作被覆盖了,孙悟空变成800岁了。

1.1.模拟冲突

代码,建立测试文件

	@Test
    void OptimisticLock(){
        Students student1 = studentsMapper.selectById(1);
        System.out.println("孙悟空的年龄 甲:" + student1.getAge());

        Students student2 = studentsMapper.selectById(1);
        System.out.println("孙悟空的年龄 乙:" + student2.getAge());

        student1.setAge(student1.getAge()-400);
        int result = studentsMapper.updateById(student1);
        System.out.println("甲是否更改年龄 : " + student1.getAge());

        student2.setAge(student2.getAge()+300);
        int result2 = studentsMapper.updateById(student2);
        System.out.println("乙是否更改年龄 : " + student2.getAge());
        
    }

运行结果:,,,,这里可以看到孙悟空的年龄变为了800岁,与阎王400岁的要求不符。
在这里插入图片描述

2.添加乐观锁

2.1数据库添加字段

在这里插入图片描述

2.2配置文件中增加乐观锁拦截器

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor MybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //配置mybatisplus分页拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //添加乐观锁拦截器
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }

}

2.3类的属性上添加注解

在这里插入图片描述

2.4再次运行测试文件

说明乙修改数据库的操作并没有进行。
在这里插入图片描述

测试结果变为了100,也说明判官乙的操作并没有并没有进行。
在这里插入图片描述

3.优化流程

将乙更改年龄的代码修改为

   student2.setAge(student2.getAge()+300);
        int result2 = studentsMapper.updateById(student2);
        System.out.println("乙是否更改年龄 : " + result2);
        if (result2 == 0){
            Students student3 = studentsMapper.selectById(student2);
            student3.setAge(student3.getAge()+300);
            int result3 = studentsMapper.updateById(student3);
            System.out.println("乙是否更改年龄 : " + result3);
        }

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值