库存出库防止超卖,基于redis解决方案(未完)

本文探讨了在使用MySQL、SpringBoot和MyBatis构建的系统中,如何处理库存减操作的并发超卖问题。通过创建库存表并设计减库存接口,作者展示了在高并发测试下出现的超卖现象。分析了问题原因,即并发更新导致的数据不一致。提出了两种解决方案:基于乐观锁的CAS更新和基于行锁的更新策略。最后提到了JMeter测试工具和项目集成Redis的可能性。

1.构建超卖场景。

mysql + springboot +mybatis

1.1创建库存表

字段

id ,商品名,库存量。

1.2 springboot创建减库存接口

 1.2.1接口的实现逻辑,先查询数量,大于本次出库量则扣减

// 最简单那的扣减库存 存在并发问题 超卖问题
    @PostMapping("/deCreateProduct")
    public void deCreateProduct( @RequestBody Product  product) {
        productService.deCreateProduct(product);
    }

    1.2.2  jmter测试 1000用户数并发执行。

1.2.3 测试前 阿莫西林3000 ,预期值执行完2000

 1.2.4实际执行后结果 只扣减了32个。

 1.2.5结果分析

        方法代码逻辑

                1.查询数量,

                2.判断大小

                3.计算扣减

                4.修改数据

          并发场景下,出现在计算扣减上,

                例如

                        A查询时3000

                                计算完 3000-1

                                然后修改2999

                        B也查询出3000

                                计算完 3000-1

                                然后修改2999

        出现了复写,导致数据不正确

 1.2.5解决方案

      解决方式基于mysql的乐观锁 在更新的时候,使用(CAS+版本号更新)+重试条件(重试次数或者重试时间限制)乐观锁的方式更新库存。

select amout ,id , version ------ 

update xx set amout  where id== and version =#{version}

     解决方式基于mysql的行锁机制 

 update product
        set amout = amout- #{amout}
        where id = #{id}
          and amout >= #{amout}

                缺点 数据库的压力太大(基于行锁适合,并发量小的情况)

       

1.3 jmter 测试

        Apache JMeter - Download Apache JMeter 下载地址。

       Jmeter教程(一) - 入门_淡淡的说非的博客-优快云博客_jmeter 使用教程。

1.3项目集成redis

1.31

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值