乐观锁:
- 业务并发现象带来的问题:秒杀(两千访问量以下)
1.在数据库表结构中加入一个字段,用来表记操纵的用户,一般叫version(int),这里我全部设置成默认值1
2.在对应的pojo类中加入version属性,使用@Version注解
3.添加乐观锁的拦截器
@Configuration
public class MpConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1.定义MyBatisPlus拦截器
MybatisPlusInterceptor mybatisPlusInterceptor=new MybatisPlusInterceptor();
//2.添加乐观锁的拦截器
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
4.测试
@Test
void testUpdate(){
Book book=new Book();
book.setId(1);
book.setPrice(99);
int i = bookDao.updateById(book);
}
由sql语句可知version自动升级,这样就可以保证每次访问的用户的version不会重复
5.模拟秒杀
@Test
void testUpdate(){
// Book book=new Book();
// book.setId(1);
// book.setPrice(99);
// book.setVersion(1);
// bookDao.updateById(book);
//1.先通过要修改的数据ID将当前数据查询出来
Book book=bookDao.selectById(1);//A用户,version=2
Book book2=bookDao.selectById(1);//B用户,version=2
//2.将要修改的属性逐一设置进去
book.setName("Jock666");
bookDao.updateById(book);//version=3
//2.将要修改的属性逐一设置进去
book2.setName("Jock888");
bookDao.updateById(book2); //version=2?条件还成立吗?此时条件不成立,update操作失败
}
由此可见jock888由于乐观锁的作用,未更新成功