• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

springboot+mybatis-plus实现“乐观锁”

武飞扬头像
愿汝妆楼颙望
帮助1

乐观锁

什么是乐观锁:是针对一些特定问题的解决方案,主要解决丢失更新问题

假如有一条数据同时被两个及以上的人进行修改,这个时候就会产生丢失更新问题。

譬如:小明想修改一条数据的money字段,他看到的money是500,他应该500太少想多加一点,改变成1000,但是小红也想改变money,她因为500太少想少加一点,改成600。小明的修改先发生,他们都是由500进行修改的,按理来说,小红应该是根据小明修改后的1000来修改成600,但是事实不是。这就叫丢失更新。

解决方案:

1悲观锁:某一个进行对一条数据进行操作时,其它人不可以操作这条数据,视为串行操作,他的          效率比较低
2乐观锁:新建一个字段为version,再进行操作时给判断版本号的值,若version一样才可以        操作数据u,否则不行

乐观锁的实现:

如图,在这个表中添加一个version字段,并且在实体类中添加这个属性。

学新通

  1.  
    package com.atguigu.mpdemo1010.enitty;
  2.  
     
  3.  
    import com.baomidou.mybatisplus.annotation.FieldFill;
  4.  
    import com.baomidou.mybatisplus.annotation.IdType;
  5.  
    import com.baomidou.mybatisplus.annotation.TableField;
  6.  
    import com.baomidou.mybatisplus.annotation.TableId;
  7.  
    import lombok.AllArgsConstructor;
  8.  
    import lombok.Data;
  9.  
    import lombok.NoArgsConstructor;
  10.  
     
  11.  
    import java.lang.reflect.Field;
  12.  
    import java.util.Date;
  13.  
     
  14.  
    @Data
  15.  
    public class User {
  16.  
     
  17.  
    @TableId(type = IdType.ID_WORKER)
  18.  
    private Long id;
  19.  
    private String name;
  20.  
    private long age;
  21.  
    private String email;
  22.  
    @TableField(fill = FieldFill.INSERT)
  23.  
    private Date createTime;
  24.  
    @TableField(fill = FieldFill.INSERT_UPDATE)
  25.  
    private Date updateTime;
  26.  
    private Integer version;//版本号
  27.  
     
  28.  
    @Override
  29.  
    public String toString() {
  30.  
    return "User{"
  31.  
    "id=" id
  32.  
    ", name='" name '\''
  33.  
    ", age=" age
  34.  
    ", email='" email '\''
  35.  
    ", createTime=" createTime
  36.  
    ", updateTime=" updateTime
  37.  
    ", version=" version
  38.  
    '}';
  39.  
    }
  40.  
    }
学新通

 在实体类中的version属性上添加一个注解:@Version

学新通

 配置一个乐观锁的插件:

学新通

mybatis-plus中提供了spring和springboot的插件配置:

spring:

利用bean来进行配置

  1.  
    <bean class="com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor" id="optimisticLockerInnerInterceptor"/>
  2.  
     
  3.  
    <bean id="mybatisPlusInterceptor" class="com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor">
  4.  
    <property name="interceptors">
  5.  
    <list>
  6.  
    <ref bean="optimisticLockerInnerInterceptor"/>
  7.  
    </list>
  8.  
    </property>
  9.  
    </bean>

springboot:创建这个类,并使用@Bean来实现乐观锁

  1.  
    @Bean
  2.  
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
  3.  
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  4.  
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  5.  
    return interceptor;
  6.  
    }

如何创建这个插件类:

方法一:直接将这个放到springboot中的启动类中

  1.  
    @MapperScan("com.atguigu.mpdemo1010.mapper")
  2.  
    @SpringBootApplication
  3.  
    public class Mpdemo1010Application {
  4.  
     
  5.  
    public static void main(String[] args) {
  6.  
    SpringApplication.run(Mpdemo1010Application.class, args);
  7.  
    }
  8.  
     
  9.  
    @Bean
  10.  
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
  11.  
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  12.  
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  13.  
    return interceptor;
  14.  
    }
  15.  
     
  16.  
    }
学新通

方法二:我们把这个配置插件放到专门的配置类中,让spring帮我自动管理

  1.  
    package com.atguigu.mpdemo1010.config;
  2.  
     
  3.  
    import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  4.  
    import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
  5.  
    import org.springframework.context.annotation.Bean;
  6.  
    import org.springframework.context.annotation.Configuration;
  7.  
     
  8.  
    @Configuration
  9.  
    public class Mpconfig {
  10.  
    @Bean
  11.  
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
  12.  
    MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  13.  
    mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  14.  
    return mybatisPlusInterceptor;
  15.  
    }
  16.  
    }
学新通

测试:

插入一条新的数据,让他再被插入时version自动赋值为1

(自动赋值在mybatis_plus文章中)

mybatis实现自填充

  1.  
    @Test
  2.  
    public void add()
  3.  
    {
  4.  
    User user = new User();
  5.  
    user.setName("titi");
  6.  
    user.setAge(22);
  7.  
    user.setEmail("302064225");
  8.  
    Integer insert = userMapper.insert(user);
  9.  
    System.out.println("insert:" insert);
  10.  
    }

运行结果:

学新通

 再通过id进行查询并修改:

  1.  
    @Test
  2.  
    public void testlgs()
  3.  
    {
  4.  
    // 根据id查询
  5.  
    User user = userMapper.selectById("1508710305724223490");
  6.  
    System.out.println("乐观锁:" user);
  7.  
    Scanner sc = new Scanner(System.in);
  8.  
    sc.nextInt();
  9.  
    user.setName("乐观锁");
  10.  
    user.setAge(11);
  11.  
    Integer row = userMapper.updateById(user);
  12.  
    }

运行结果:

学新通

因为我在上面的testlgs方法中添加了输入语句,可以暂停程序的运行,这时我们去强行修改user表中的1508710305724223490为id的数据的version为3,然后再继续运行程序,看一下不同的效果。

运行结果如下:

学新通

我们看到他的update是为0的就说明没有数据更新成功,所以他没有更新

我们再看一下数据的库的值,是不是还是我们强行修改后的3

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgjkajj
系列文章
更多 icon
同类精品
更多 icon
继续加载