前言
在操作关系数据库管理系统里,经常会遇到锁的问题,在数据库中有行锁、页锁和表锁。在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。
编写单元测试二,本次更新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);
}
复制代码
运行结果如下,可以看到版本号已经进行了自动更新:
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的乐观锁,感谢您的阅读,希望您喜欢,如对您有帮助,欢迎点赞收藏。如有不足之处,欢迎评论指正。下次见。
作者:小阿杰
链接:https://juejin.cn/post/7031535946394763271
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。