mall
mall copied to clipboard
锁定库存的问题
目前看项目中锁定库存的逻辑是这样的: ①在产生订单的逻辑中判断库存表中的stock真实库存是否为0,为0则下单失败,否则进行锁定库存对lock_stock字段加一 ②在支付的过程对lock_stock和stock字段同时减一
问题:lock_stock字段貌似没有进行任何的逻辑处理,只是设置了一个字段? 这样的后果是,如果后台同时在一段时间下单担均没支付,均在5分钟后才付款,由于下单时只对lock_stock进行加一,并且没有任何逻辑,在5分钟后支付时会对stock和lock_stock减一,那么若此时产生的订单数大于stock数,依然能够进行支付,因为判断库存的逻辑只在生成订单的时候对stock的值进行了判断,那么此时stock就减到负值了
我也发现了这个bug,应该还要加个if判断当前购物车的数量和 stock-lock_stock是否充足
/**
* 判断下单商品是否都有库存
*/
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; }
库存那块没有处理,存在超卖风险
是的 超卖没有处理
下单库存锁定应该会有并发问题吧?
这就是个demo
这就是个demo
是的,生成订单里面没考虑加锁问题,积分和优惠券一样的问题
就是个demo,实际生产用还不够。还只是单体服务,还没考虑事务。
的确,这项目里我也找不到关于超卖的处理方法,有的话麻烦告知一声。。