乐观锁与悲观锁
乐观锁:十分乐观,总是认为不会出现问题,无论干什么,都不会去上锁。如果出现了问题,就再次更新值测试。
悲观锁:十分悲观,认为总是出现问题,无论干什么,都去上锁。再去操作。
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
-- 多线程下 锁的处理
-- 乐观锁: 1. 先查询,获取版本号 version = 1
-- A 线程
update user set name = 'jack', version = version + 1
where id = 1 and version = 1
-- B 线程抢先完成,这个时候 更新version为 2,会导致A 修改失败
update user set name = 'jack', version = version + 1
where id = 1 and version = 1
解决方案
-
在表中加上version字段,int类型,默认值0
-
就目前最新版本的插件是3.4.1 ,需要将插件添加到拦截器中。不是注入bean。
新版:OptimisticLockerInnerInterceptor
在3.4.1 中块过时的: OptimisticLockerInterceptor
- 在version字段上添加@Version 解决。
code
package cn.bitqian.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* mybatis plus配置类
* @author echo lovely
* @date 2020/11/15 09:48
*/
@EnableTransactionManagement // 开启事务
@MapperScan("cn.bitqian.mapper")
@Configuration
public class MyBatisPlusConfig {
// mybatis插件注册
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 乐观锁
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
// 添加乐观锁到插件中
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
字段需要添加
测试
@Test
void testOptimisticLocker1() {
User user = userMapper.selectById(1327447426226786310L);
// 抢先修改
User user1 = userMapper.selectById(1327447426226786310L);
user1.setName("jjj");
userMapper.updateById(user1);
// 不会被修改,因为由于上面的修改version变了
user.setName("bitqian666");
userMapper.updateById(user);
}