配置MyBatis Plus 的乐观锁功能

文章介绍了如何配置MyBatisPlus的乐观锁功能,包括在数据库表中添加version字段,实体类中使用@Version注解,定义拦截器动态追加SQL,以及通过比较version旧值与新值来确保修改操作的原子性。乐观锁通过非阻塞的CAS机制提高并发性能,但也存在只能保证单个变量原子性和自旋开销的问题。
摘要由CSDN通过智能技术生成

一. 回顾CAS乐观锁

乐观锁有两种实现方式:

  1. 版本号
  2. CAS机制

CAS:

  • CASCompare and Set,是乐观锁的一种;是非阻塞的轻量级的锁;

  • 需要保证变量的可见性,所以配合 volatile 使用;

  • 乐观锁思想即不怕别的线程来修改共享变量;悲观锁即阻塞式索,同一时间只允许一个线程去访问资源;

思想

  1. 外面是用 while(true) 死循环不断尝试(自旋) ;
  2. 线程从【主内存】中拷贝共享变量到【工作内存】,即获取旧值
  3. 使用CompareAndSet 尝试修改,判断当前共享变量的值是否等于工作内存中的旧值,是则修改成功,反之失败;

当前共享变量的值和旧值相等,即说明线程从获取旧值到修改这段时间内,其他线程没有修改这个共享变量的值(或者ABA情况);

例:银行转账
用prev代表余额并记录下来,余额即工作内存从主内存获取的变量的旧值;
next是要修改的值;
而是否修改成功,取决于当前余额的值(最新值)是否等于之前记录的prev旧值;
在这里插入图片描述

总结
优点
1.无所并发,效率高

缺点
1.只能保证一个共享变量的原子操作;而多个变量使用互斥锁更容易
2.while(true )长时间自旋转导致开销大

二. 配置MyBatis Plus 的乐观锁

(1)数据库:添加version版本号

在数据库表中加一个version版本号字段;

在这里插入图片描述

(2)实体类:添加version版本号属性,@Version注解

2.实体类中也加version字段,添加 @Version表示这是版本号,version会由MyBatisPluas自动递增,通过版本号变更表示线程已经修改过;
在这里插入图片描述

(3)定义拦截器

定义拦截器对sql进行动态追加!
和配置分页查询一样,先定义拦截器,再添加具体哪种拦截器;
在这里插入图片描述

注意:分页查询功能和乐观锁功能需要使用拦截器;

(4)开始修改

①先要通过id获取一个查询对象,主要是获取 version 旧值
②使用 updateById 修改,乐观锁会 判断当前version值(最新值)和之前查询得的旧值是否相等,相等即修改成功,否则失败;
在这里插入图片描述

结果
user2修改成功,user修改失败:
在这里插入图片描述

解析sql
user和user2都获取了version旧值为3,当user2修改后version变成4;
此时user再尝试修改时,之前获取的旧值3和当前version=4不等,则修改失败;
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值