MybatisPlus进阶篇学习笔记(四)------乐观锁

原创:兜里的猫

本章目录

  • 乐观锁简介
  • 乐观锁实现
  • 注意事项

1 乐观锁简介

乐观锁顾名思义就是在操作时很乐观,认为操作不会产生并发问题(不会有其他线程对数据进行修改),因此不会上锁。但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS(compare and swap)算法实现。

简单理解:这里的数据,别想太多,你尽管用,出问题了即操作失败后事务回滚。版本号、CAS这2种方法本质上是一样的:假如满足条件,做你想做的事,条件判断是原子的或者是快速的,耗时几乎不计。

主要适用场景:

当要更新一条记录的时候,希望这条记录没有被别人更新,确保当前只有一个人在操作。

乐观锁实现方式

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

核心SQL:

update table set name = 'update', version = version + 1 where id = #{id} and version = #{version};

这里顺带提下悲观锁和乐观锁区别:

  • 悲观锁: 悲观的认为我要修改的数据一定会被他人修改,如果我要修改数据,我就会给数据上锁,别人都不能去修改,我修改完之后别人才可以修改。一旦加锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放。

  • 乐观锁:乐观的认为我修改的数据别人别人不会去改,但是在更新的时候会判断其他线程在这之前有没有对数据进行修改,可以使用版本号机制(version)和CAS算法实现。

两种锁适用场景:

  • 乐观锁适用于写少读多的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。

  • 悲观锁适用于写多读少,多写,一般会经常产生冲突,这就会导致上层应用会不断的进行重试,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。

阿里巴巴建议以冲突概率20%这个数值作为分界线来决定使用乐观锁和悲观锁,
虽然说这个数值不是绝对的,但是作为阿里巴巴各个大佬总结出来的也是一个很好的参考。

2 乐观锁实现

这里记个坑,项目使用的mp 3.3.0版本加入乐观锁会导致自动填充updateTime失效,后改用3.3.1.tmp版本正常使用!!!

乐观锁配置需要2步

①.在MybatisPlusConfiguration配置类中加入乐观锁插件bean

@Configuration
public class MybatisPlusConfiguration {
/**
 * 乐观锁插件
 */
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    return new OptimisticLockerInterceptor();
}

}

②.将实体类User中version字段加上注解@Version

@Version
private Integer version;

测试代码如下:

image
image

从图中可以看出使用乐观锁的时候需要我们在user类中setVersion,这是为了在进行update的时候更新version版本,where条件中的version是我们原本的version,set中的version是原本的version+1。

3 注意事项

  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion 会回写到 entity 中
  • 仅支持 updateById(id) 与 update(entity, wrapper) 方法
  • ==在 update(entity, wrapper) 方法下, wrapper 不能复用!!!==

这里演示下最后一个,什么叫wrapper不能复用?

image
image

从代码中看到我在执行第二次update的时候还是用的之前的queryWrapper,导致mp在进行sql拼接的时候将version拼接了2次,2次的version肯定不一样,所以不会更新成功。

兜里的猫 小程序

本文作者:兜里的猫

本文链接:https://www.wldeer.com/archives/mybatisplus进阶篇学习笔记四------乐观锁

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!

dvdf

欢迎访问博客网页版:www.wldeer.com

评论

稻城 : 111
兜里的猫 : 是md
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×