MyBatisPlus乐观锁

文章介绍了如何在秒杀场景下使用乐观锁来解决并发问题。通过在数据库表中添加version字段,并在Java对象中使用@Version注解,配合MybatisPlusInterceptor拦截器,确保了数据的一致性。在测试中,当两个用户尝试同时更新同一记录时,乐观锁机制使得只有一个更新能成功,防止了数据冲突。
摘要由CSDN通过智能技术生成

乐观锁:

  • 业务并发现象带来的问题:秒杀(两千访问量以下)

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由于乐观锁的作用,未更新成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值