当前位置:   article > 正文

mybatis-plus 乐观锁_mybatisplus 乐观锁

mybatisplus 乐观锁

1、概念

乐观锁

当要更新一条记录的时候,希望这条记录没有被别人更新。

乐观锁实现方式:

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

乐观锁:顾名思义十分乐观,它总是认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再次更新值测试。

悲观锁:顾名思义十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!

2、实现

表中添加version字段

默认值为1

在这里插入图片描述

实体类添加字段

    /**
     * 乐观锁注解
     */
    @Version
    private Integer version;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
注册组件

注意:

  • 将启动类上的@MapperScan注解移到配置类中
  • 使用高版本的依赖,比如现在使用的是3.4.3版本,不然MybatisPlusInterceptor该类不存在
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

配置类:

package cn.com.dwr.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@MapperScan("cn.com.dwr.mapper") // 扫描mapper
@EnableTransactionManagement // 自动管理事务
@Configuration // 配置类
public class MybatisPlusConfig {

    /**
     * 注册乐观锁插件
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
测试

成功案例:

    /**
     * 测试乐观锁成功案例
     */
    @Test
    public void testOptimisticLocker(){
        // 1.查询用户信息
        User user = userMapper.selectById(1L);
        // 2.修改用户信息
        user.setName("Paul");
        user.setEmail("33334343@qq.com");
        // 3.执行更新操作
        userMapper.updateById(user);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

sql语句:
在这里插入图片描述

数据库中发现更新时间变化了,版本号变为了2
在这里插入图片描述

失败案例:

	/**
     * 测试乐观锁失败案例:多线程下
     */
    @Test
    public void testOptimisticLocker2(){
        // 线程1
        User user = userMapper.selectById(1L);
        user.setName("Mike");
        user.setEmail("mike@qq.com");

        // 模拟另外一个线程执行了插队操作
        User user2 = userMapper.selectById(1L);
        user2.setName("Candy");
        user2.setEmail("candy@qq.com");
        userMapper.updateById(user2);

        userMapper.updateById(user);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

sql语句:
在这里插入图片描述
发现user的值并没有改变,因为version的值不对,更新失败。

在这里插入图片描述

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号