乐观锁插件
创建时间:2025-11-13 22:54
长度:1685
浏览:0
评论:0
官网介绍: https://baomidou.com/plugins/optimistic-locker/
乐观锁与悲观锁
在程序世界中,乐观锁和悲观锁的最终目的都是为了保证线程安全,避免在并发场景下的资源竞争问题。但是,相比于乐观锁,悲观锁对性能的影响更大!
字面意思理解:
乐观锁:总是假设最好的情况,认为别人都是友好的,所以每次获取数据的时候不会上锁,但更新数据那一刻会判断数据是否被更新过了,如果数据的值跟自己预期一样的话,那么就可以正常更新数据。
悲观锁:悲观锁就好像—个有迫害妄想症的患者,总是假设最坏的情况,每次拿数据的时候都以为别人会修改,所以每次拿数据的时候都会上锁,直到整个数据处理过程结束,其他的线程如果要拿数据就必须等当前的锁被释放后才能操作。
MyBatis-Plus给出的实现方式
•取出记录时,获取当前 version
•更新时,带上这个version
• 执行更新时, set version = newVersion where version = oldVersion
• 如果 version 不对,就更新失败
具体实现:
1. 需要在数据库User表中添加版本version字段

2. 在java User类中添加version成员、并且增加注解
public class User {
...
@Version // 乐观锁注解
private Integer version;
}3. 配置,在config 目录下新增MybatisPlusConfig.java文件
@Configuration
@MapperScan(basePackages = "org.huangcy.mybatisplusdemo.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}
4. 模拟并发修改测试
// 模拟多线程并发修改
@Test
void mybatisOptimisticLockerTest() {
System.out.println("------线程1-----");
// 查询用户信息(查出version)
User user = userMapper.selectById(1L);
// 修改用户信息
user.setName("Huangcy");
user.setAge(19);
System.out.println("------线程2-----");
User user2 = userMapper.selectById(1L);
user2.setName("Huangcy22");
user2.setAge(1922);
// 执行更新
userMapper.updateById(user2); // 线程2执行更新
userMapper.updateById(user); // 线程1执行更新
}在上面测试中,如果没有乐观锁的话,那么最后的name 应该是Huangcy age是19,现在加了乐观锁后,先执行线程2的,再执行线程1,发现version不一致,所以不会更新;