方案1:在下单就锁定库存
优点:可以解决库存减扣问题
缺点:体验差,如果只下单未付款,库存被锁定,让有意愿购买的用户无从下单,对销售业务有很大影响;
方案2:支付后减扣库存
优点:防止恶意下单,只要有足够的实际库存,随便多少意向客户下单
缺点:下单页面显示的库存数可能不是最新的库存数,其他用户可能提示库存不足,可能出现超卖问题。
方案3:调起支付界面前锁定库存
优点:防止恶意下单,只要有足够的实际库存,随便多少意向客户下单
缺点:体验差,有可能在支付时提示库存被其他用户锁定,提示库存不足
方案4:下单占库存根据库存大小决定库存锁定时间
库存充足下单占库存,设定库存最大占用时间,按库存大小限购数量按策略缩减库存占用时间
具体以哪种方案为主还是要看公司的业务做决定
下面主要讲解方案3 支付前锁定库存的的实现步骤,以下是使用到的关键表
-------------------------------------------------------------------------------------
订单表
订单唯一编号 库存锁定状态(1库存已锁定 2库存已释放 3库存已确认,库存减扣成功)
-------------------------------------------------------------------------------------
订单详细表
订单编号 商品id 购买数量
-------------------------------------------------------------------------------------
商品库存表
商品id 库存数量 实际锁定库存数量 预锁定库存数量 限购数量
-------------------------------------------------------------------------------------
A商品库存 1个
用户1 下单1个
用户2 下单1个
业务场景及解决方式:
1.支付前预占库存 :用户1和用户2可能同时点击支付按钮,此时对于商品锁定库存来说只能有一个用户会锁定A商品的库存,剩下一个肯定锁定失败,此时应该提示其中一个用户(库存可能不足,请稍后再试),这里更新库存减扣应该都有前置条件的或者说版本号
2.限制支付时间,需要设置一个支付时间
(设置三方支付过期时间为30分钟)调起支付页面锁定库存30分钟,30分钟后还未支付则还原预减库存
3.检测恶意下单用户加入到店铺黑名单
4.加入限购
5.优化方式
另一个用户跳转到三方支付界面,
如果此用户取消支付,客户端应该发送一条消息告诉服务端恢复库存锁定,
如果此用户支付成功,客户端应该发送一条消息告诉服务端确认减扣库存,
客户端可能因某种情况发送失败,此时要考虑使用定时任务恢复超过多久库存还处于(根据锁定状态)锁定中的订单商品库存,应该先调用支付系统关闭原有未完成支付的订单,然后再恢复商品锁定库存
支付系统异步通知支付成功修改库存,此时根据库存锁定状态进行不同的业务处理(1库存已锁定 2库存已释放 3库存已确认,库存减扣成功)
6.
想到了再补充