当前位置:   article > 正文

Mybatis-Plus(插件篇 ==> 乐观锁插件_mybatisplus乐观锁插件

mybatisplus乐观锁插件

本章导学:

  • 什么是乐观锁
  • 为什么要使用乐观锁
  • 基于SpringBoot实现乐观锁

一、什么是乐观锁

当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

  • 取出记录时,获取当前 version
  • 更新时,带上这个 version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果 version 不对,就更新失败

二、为什么要使用乐观锁 

我们先看一个场景:

某公司产品销量不好,于是老板吩咐小王把产品定价下调50元,小王一口答应了下来,但是小王还在摸鱼,没有马上去修改产品的定价。过了一会老板觉得下调50元太亏了,于是吩咐另外一个员工小白去把产品定价下调30元。不巧的是,小王和小白先后对这条数据进行了更新,于是产品价格被调低了80元,老板亏死了~。

我们用代码模拟一下这个场景

我们观察一下sql语句

 

那如果去解决这个并发冲突呢?我们可以采取以下的方法(乐观锁)

  • 取出记录时,获取当前 version
  • 更新时,带上这个 version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果 version 不对,就更新失败

三、基于SpringBoot实现乐观锁 

我们新建一个配置类,添加乐观锁拦截器

  1. package com.brrbaii.Config;
  2. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  3. import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
  4. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. @Configuration
  8. public class MpConfig {
  9. @Bean
  10. public MybatisPlusInterceptor mybatisPlusInterceptor(){
  11. //1,定义Mp拦截器
  12. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  13. //2,添加具体的拦截器,这里添加的为分页拦截器
  14. mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
  15. //3,添加乐观锁拦截器
  16. mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  17. return mybatisPlusInterceptor;
  18. }
  19. }

在数据库和实体类上各自添加一个Version字段 

重新执行测试方法

  1. @Test
  2. public void test02(){
  3. //需求:原价7800,最终降价为7770
  4. //小王进行数据
  5. Dish dishAA = dishMapper.selectById(1397849739276890114l);
  6. //小白进行查询
  7. Dish dishBB = dishMapper.selectById(1397849739276890114l);
  8. //小王修改价格,下调50元
  9. dishAA.setPrice(dishAA.getPrice().subtract(new BigDecimal(50)));
  10. dishMapper.updateById(dishAA);
  11. //小白修改价格,下调30元
  12. dishBB.setPrice(dishAA.getPrice().subtract(new BigDecimal(30)));
  13. dishMapper.updateById(dishBB);
  14. }

小王执行的修改语句 :

小王此时进行修改会先判断version是否等于从数据里查出来的version,然后对version自增1 


 小白执行的修改语句: 

由于小王操作后,version已经从0加到1了,所以小白的where version = 0判断为false,更新失败 

乐观锁实现方法总结: 

  1. MybatisPlusInterceptor添加乐观锁拦截器(OptimisticLockerInnerInterceptor)
  2. 在实体类和数据库上分别添加version字段

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/435899
推荐阅读
相关标签
  

闽ICP备14008679号