MybatisPlus乐观锁
现在有个问题,如果你在业务中用到了秒杀的话,假如这件商品有200单,然后一群用户去抢这200单。当它还有1件时,假如八个人去抢那么就会变成负数,这是绝对不行的,所以就需要用到乐观锁。
那么怎么使用乐观锁呢?
首先新增一个字段version,也就是锁,也叫版本。
然后在实体中加入version字段和version注解
这个version需要的具体实现是这种的
update set abc=123 ,version=version+1 where version=1
假如修改某一个值set abc=123,条件是锁为1的情况下可以去改,但是呢因为默认值是1所以别人拿到的锁也是一样的,这样就需要去升级,假如你是1,然后到我这就做一个版本的升级就是2了,确保每个人的锁都是不同的。
接下来需要实现这个的话需要配置mybatisplus的拦截器
@Configuration
public class MPConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor( new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
下面测试
要使用这个乐观锁,必须使用version。我们发现传参的是1,结果是+1后得到了2,是正确的。
当然你也可以这么做,先根据id查询这条数据,这条数据就包含了version。然后再去设置你需要修改的数据,再去更新。原理是一样的,因为做了两遍操作,所以我们的version现在是3
那么怎么实现加锁呢?
我们现在模拟A用户去修改这个数据,然后模拟B用户去修改这个数据
Book book1 = bookMapper.selectById(38);//version=3
Book book2 = bookMapper.selectById(38);//version=3
book1.setName("springboot");
bookMapper.updateById(book1);
//version=4
book2.setName("springboot2");
bookMapper.updateById(book2);
//上边的book1 version已经变成了4,而这个version=3的条件已经不能成立了
book1的version执行完后已经变成了4
而book2执行的时候由于book1执行完后version已经变成了4,所以这个version=3的条件是成立不了的,也就是book2无法更新。
可以看到book1的更新成功了。