springboot整合mybatisPlus(3) 乐观锁的实现

本文详细介绍了乐观锁的概念,通过版本号机制解释其工作原理,并展示了如何在SpringBoot结合MybatisPlus中使用乐观锁插件,包括插件配置、注解实体字段@Version的使用,以及代码演示,包括数据库表设计、并发接口测试,帮助理解乐观锁在并发场景下的应用。
摘要由CSDN通过智能技术生成

1:乐观锁

1.1:乐观锁简介

乐观锁:总是假设最好的情况,在读取数据的使用不会发生并发问题,但在更新的时候比较原数据是否被其他线程发生了改变。主要通过通过版本号机制或CAS算法实现,适用于读多写少的应用场景。

版本号机制:在数据库表中加一个版本号version字段,表示数据被修改的次数,在修改数据前先读取该表中的版本号字段,在修改的使用对比是否是自己读取出来的版本号如果是则进行更新操作并版本号(version)加1如果不是则重新执行进行更新操作直到更新成功为止。

CAS:compare and swap 顾名思义就是比较与替换。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。
内存位置的值是否与预期原值一样如果一样则用新值更新,如果不则重试。CAS算法实现会导致ABA问题的产生。

ABA问题:A线程某一时刻获取内存位置的值为10,与其原值也为10,在这个过程中假设B线程对内存位置的值进行了修改,修改我为12,下一毫米又对内存中的值进行了修改,修改为10。这是A线程把值修改为13修改成功。这就是ABA问题。通俗易懂的来讲就是:你大爷是你大爷,你大妈已经不是你大妈了。乐观锁通常使用版本号机制来避免ABA问题。

1.2:乐观锁的例子

未使用乐观锁(实现存钱取钱)

A操作人员 B操作人员
查询余额(100¥) 查询余额(100¥)
存入10¥(100¥+10¥) 喝咖啡中
喝咖啡中 取出10¥(100¥-10¥)
查询余额 (90¥) 喝咖啡中
查询余额 (90¥) 查询余额 (90¥)

以使用乐观锁(实现存钱取钱)

A操作人员 B操作人员
查询余额(100¥)version=1 查询余额(100¥)version=1
存入10¥(100¥+10¥)把查询余额中的version进行对比匹配version+1充值成功 喝咖啡中
喝咖啡中 取出10¥(100¥-10¥)把查询余额中的version进行对比,结果不匹配 ,取出不成功,重新进行取钱操作,查询余额(110¥)version=2,把查询余额中的version进行对比匹配version+1取出成功 (110¥-10¥)
查询余额 (100¥) 喝咖啡中
查询余额 (100¥) 查询余额 (100¥)

2:springboot整合mybatisPlus 乐观锁插件

本章会设计到 springboot整合mybatisPlus整合使用,springboot整合swagger2整合使用,需要的可以看我其他的博文

2.1 插件配置

package cloud.xingzhe.springbootmybatisplus;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@MapperScan
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SpringBoot整合MybatisPlus可以很方便地实现分页查询,而MybatisPlus本身也提供了物理分页的功能。下面是实现步骤: 1.在pom.xml文件中添加MybatisPlus和分页插件的依赖。 2.在application.yml文件中配置分页插件。 3.在Mapper接口中添加分页查询方法,使用MybatisPlus提供的Page对象进行分页查询。 4.在Service层中调用Mapper接口中的分页查询方法,将查询结果封装到Page对象中返回给Controller层。 5.在Controller层中接收前端传来的分页参数,调用Service层中的分页查询方法,将查询结果返回给前端。 具体实现代码可以参考以下示例: 1.在pom.xml文件中添加MybatisPlus和分页插件的依赖: ``` <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> ``` 2.在application.yml文件中配置分页插件: ``` mybatis-plus: configuration: # 开启驼峰命名转换 map-underscore-to-camel-case: true # 配置分页插件 plugins: - com.github.pagehelper.PageInterceptor # 配置分页插件的参数 pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql ``` 3.在Mapper接口中添加分页查询方法,使用MybatisPlus提供的Page对象进行分页查询: ``` public interface UserMapper extends BaseMapper<User> { /** * 分页查询用户列表 * @param page 分页参数 * @return 用户列表 */ List<User> selectUserList(Page<User> page); } ``` 4.在Service层中调用Mapper接口中的分页查询方法,将查询结果封装到Page对象中返回给Controller层: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Override public Page<User> getUserList(Page<User> page) { return userMapper.selectUserList(page); } } ``` 5.在Controller层中接收前端传来的分页参数,调用Service层中的分页查询方法,将查询结果返回给前端: ``` @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @GetMapping("/list") public Result getUserList(@RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize) { Page<User> page = new Page<>(pageNum, pageSize); Page<User> userList = userService.getUserList(page); return Result.success(userList); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值