3. 异步扣库存的问题

在上面的文章中,我们实现了异步扣库存,但是还是存在问题。

1.超卖问题的解决

在原来单体架构的过程中,我们可以使用redis锁,实现超卖问题的解决

    @Override
    public Integer decreaseStock(List<OrderItem> orderItemList) {
        /**
         * 加锁
         */
        int count = 0;
        for (OrderItem orderItem: orderItemList) {
            /**
             * 加锁
             */
            long time = System.currentTimeMillis() + TIMEOUT;
            if(!redisLock.lock(orderItem.getGoodsId().toString(), String.valueOf(time))){
                throw new LovingMallException(ExceptionCodeEnum.SYSTEM_BUSY);
            }
            GoodsInfo goodsInfo = goodsInfoMapper.selectByPrimaryKey(orderItem.getGoodsId());
            if(goodsInfo == null){
                throw new LovingMallException(ExceptionCodeEnum.PRODUCT_NOT_EXIT);
            }
            Integer resultStock = goodsInfo.getStockNum() - orderItem.getGoodsCount();

            if(resultStock < 0){
                throw new LovingMallException(ExceptionCodeEnum.STOCK_WARN);
            }
            goodsInfo.setStockNum(resultStock);
            count += goodsInfoMapper.updateByPrimaryKeySelective(goodsInfo);
            /**
             * 解锁
             */
            redisLock.unlock(orderItem.getGoodsId().toString(),String.valueOf(time));
        }
        return count;
    }
        // 6.扣库存
        count = goodsInfoService.decreaseStock(orderDTO.getOrderItemList());
        if(count > 0){
            return ServerResponse.createBySuccessMessage("下单成功");
        }else {
            throw new LovingMallException(ExceptionCodeEnum.STOCK_WARN);
        }

现在微服务架构下,redis锁,已经不再适合,因为消费者(product)消费消息(message)的时间是不确定的。
推荐方法:

慕课网廖师兄提供

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。