mall icon indicating copy to clipboard operation
mall copied to clipboard

锁定库存的问题

Open Mr-90-Style opened this issue 4 years ago • 9 comments

目前看项目中锁定库存的逻辑是这样的: ①在产生订单的逻辑中判断库存表中的stock真实库存是否为0,为0则下单失败,否则进行锁定库存对lock_stock字段加一 ②在支付的过程对lock_stock和stock字段同时减一

问题:lock_stock字段貌似没有进行任何的逻辑处理,只是设置了一个字段? 这样的后果是,如果后台同时在一段时间下单担均没支付,均在5分钟后才付款,由于下单时只对lock_stock进行加一,并且没有任何逻辑,在5分钟后支付时会对stock和lock_stock减一,那么若此时产生的订单数大于stock数,依然能够进行支付,因为判断库存的逻辑只在生成订单的时候对stock的值进行了判断,那么此时stock就减到负值了

Mr-90-Style avatar Jul 09 '20 07:07 Mr-90-Style

我也发现了这个bug,应该还要加个if判断当前购物车的数量和 stock-lock_stock是否充足

qaz279593395 avatar Jul 21 '20 14:07 qaz279593395

/**
 * 判断下单商品是否都有库存
 */
private boolean hasStock(List<CartPromotionItem> cartPromotionItemList) {
    for (CartPromotionItem cartPromotionItem : cartPromotionItemList) {
        if (cartPromotionItem.getRealStock()==null||cartPromotionItem.getRealStock() <= 0) {
            return false;
        }
    }
    return true;
}

改为 /** * 判断下单商品是否都有库存 */ private boolean hasStock(List<CartPromotionItem> cartPromotionItemList) { for (CartPromotionItem cartPromotionItem : cartPromotionItemList) { if (cartPromotionItem.getRealStock()==null||cartPromotionItem.getRealStock()-cartPromotionItem.getQuantity() < 0) { return false; } } return true; }

qaz279593395 avatar Jul 21 '20 15:07 qaz279593395

库存那块没有处理,存在超卖风险

zhaidaoxin avatar Aug 20 '20 09:08 zhaidaoxin

是的 超卖没有处理

wangjia2016 avatar Oct 02 '20 12:10 wangjia2016

下单库存锁定应该会有并发问题吧?

keyuxiaohui avatar Nov 13 '20 07:11 keyuxiaohui

这就是个demo

wufeiha avatar Mar 22 '21 07:03 wufeiha

这就是个demo

是的,生成订单里面没考虑加锁问题,积分和优惠券一样的问题

99246255 avatar Mar 31 '21 07:03 99246255

就是个demo,实际生产用还不够。还只是单体服务,还没考虑事务。

JiyunDeng avatar Jun 03 '23 11:06 JiyunDeng

的确,这项目里我也找不到关于超卖的处理方法,有的话麻烦告知一声。。

lldm avatar Jul 10 '23 15:07 lldm