【Spring Boot 快速入门】十八、Spring Boot 集成Mybatis_Plus的乐观锁

简介: 【Spring Boot 快速入门】十八、Spring Boot 集成Mybatis_Plus的乐观锁

前言


  在操作关系数据库管理系统里,经常会遇到锁的问题,在数据库中有行锁、页锁和表锁。在Java的开发过程中,经常会遇到悲观锁和乐观锁。乐观锁和悲观锁对于理解Java多线程、并发和数据库来说至关重要。下面和大家已起聊聊关于Mybatis_Plus乐观锁。


数据库锁


  锁是数据库中的一个重要的概念,在大数据高并发的情况下,如果同一条数据被多个线程读取,可能会出现幻读、脏读、误读的情况。所以引入了锁。在程序员操作方面,可以根据锁的使用分类悲观锁和乐观锁。

  悲观锁总是认为最坏的情况会出现,当前的数据可能被修改,从而在读取数据的时候就会把资源或者数据进行锁定,其他线程使用这个数据或者资源的时候就会阻塞等待,直到悲观锁将锁释放之后,其他资源才可以使用。

  乐观锁与悲观锁正好相反,乐观锁总是认为资源和数据不会被修改,在读取数据和资源时不会进行加锁。但是乐观锁是在写入操作的时候会判断当前数据和资源是否修改过。乐观锁的实现方案一般来说有两种: 版本号机制 和 CAS实现 。

  在我们的项目中,使用Mybatis_Plus敏捷开发,近期学习了一下基于Mybatis_Plus的乐观锁,下面快速开始熟悉吧。


快速开始


版本介绍


  本次将基于Spring Boot 搭建一个学习Mybatis_Plus的乐观锁的Demo。开发环境如下:


JDK1.8
SpringBoot 2.3.0.RELEASE
mybatis-plus 3.3.0

  

Mybatis_Plus的乐观锁的实现原理是基于版本号机制进行控制的。当在取出一条数据后,将对该条数据进行更新修改操作,会获取当前数据的version版本号,在更新时带上version版本号信息,执行更新时,会判断当前的version版本号与数据库中的版本号是否一致,一致则更新成功version版本号+1,如果version版本号信息不一致,则证明数据被修改过,更新数据失败。了解了原理,下面快速开始。


引入依赖


本次学习使用的依赖包如下:


<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-extension</artifactId>
            <version>3.4.0</version>
        </dependency>


配置乐观锁


在项目中配置乐观锁的拦截器信息如下:


@Component
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}


指定版本号


  在我们数据库的实体对象中指定一个版本号字段,并用注解@Version注释该字段。@Version注释的字段类型支持:int,Integer,long,Long,Date,Timestamp,LocalDateTime,在整数类型下newVersion = oldVersion + 1会自动递增版本号,需要注意的是仅支持updateById()和update(entity, wrapper)方法。 本次建立一个User对象。

@ApiModel(value = "com-example-demo-module-User")
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.INPUT)
    private Integer id;
    @TableField(value = "name")
    private String name;
    @TableField(value = "age")
    private int age;
    @Version
    private int version;
}


单元测试


编写完如上基本配置之后,就可以进行简单的单元测试了。首先我们创建一个用户信息。

@Test
    void TestUser(){
        User user = new User();
        user.setName("测试1");
        user.setAge(12);
        userMapper.insert(user);
    }


可以看到用户“测试1”已经新增成功,当前的用户id是19。


image.png

编写单元测试二,本次更新2次id为19的用户信息。


@Test
    void TestUser(){
        User user = userService.getById(19);
        System.out.println(user);
        //开始更新一次
        userService.updateByTest(user);
        user.setName("测试32222");
        userService.updateById(user);
        User user1 = userService.getById(user.getId());
        System.out.println("第二个更新的方法:" +user1);
    }


运行结果如下,可以看到版本号已经进行了自动更新:

image.png

User{id=19, name='测试32222', age=12, version=0}
第一个更新的方法:User{id=19, name='123456', age=12, version=1}
第二个更新的方法:User{id=19, name='测试32222', age=12, version=2}


结语


  好了,以上就是Spring Boot 集成Mybatis_Plus的乐观锁


目录
相关文章
|
5月前
|
JSON 分布式计算 大数据
springboot项目集成大数据第三方dolphinscheduler调度器
springboot项目集成大数据第三方dolphinscheduler调度器
299 3
|
5月前
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
570 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
分布式计算 大数据 Java
springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务
springboot项目集成大数据第三方dolphinscheduler调度器 执行/停止任务
110 0
|
5月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
167 0
|
XML Java 关系型数据库
【SpringBoot系列】SpringBoot集成Fast Mybatis
【SpringBoot系列】SpringBoot集成Fast Mybatis
|
XML SQL Java
ClickHouse【SpringBoot集成】clickhouse+mybatis-plus配置及使用问题说明(含建表语句、demo源码、测试说明)
ClickHouse【SpringBoot集成】clickhouse+mybatis-plus配置及使用问题说明(含建表语句、demo源码、测试说明)
2126 0
|
9月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
493 0
|
9月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
739 0
|
9月前
|
Java 数据库连接 数据库
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
1235 0