乐观锁:通过版本号控制并发问题
当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:
????????取出记录时,获取当前version
????????更新时,带上这个version
????????执行更新时, set version = newVersion where version = oldVersion
????????如果version不对,就更新失败
(1)数据库表中添加version字段,作为乐观锁版本号
(2)? 对应实体类添加version字段,即版本号属性,在实体类版本号属性添加注解
spring boot 注解方式:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
创建一个包config,包中创建一个配置类 MpConfig,添加Configuration注解,把启动类中的mapperScan注解也可移到配置类中来
// Spring Boot 方式
@Configuration
@MapperScan("按需修改")
public class MybatisPlusConfig {
/**
* 旧版
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
/**
* 新版
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
测试乐观锁:先查询后修改
/**
* 测试 乐观锁插件
*/
@Test
public void testOptimisticLocker() {
//查询
User user = userMapper.selectById(1L);
//修改数据
user.setName("Helen Yao");
user.setEmail("helen@qq.com");
//执行更新
userMapper.updateById(user);
}
/**
* 测试乐观锁插件 失败
*/
@Test
public void testOptimisticLockerFail() {
//查询
User user = userMapper.selectById(1L);
//修改数据
user.setName("Helen Yao1");
user.setEmail("helen@qq.com1");
//模拟取出数据后,数据库中version实际数据比取出的值大,即已被其它线程修改并更新
了version
user.setVersion(user.getVersion() - 1);
//执行更新
userMapper.updateById(user);
}