方案1:在下单就锁定库存
优点:可以解决库存减扣问题
缺点:体验差,如果只下单未付款,库存被锁定,让有意愿购买的用户无从下单,对销售业务有很大影响;
方案2:支付时锁定库存
-------------------------------------------------------------------------------------
订单表
订单唯一编号 库存锁定状态(1库存已锁定 2库存已释放 3库存已确认,库存减扣成功)
-------------------------------------------------------------------------------------
订单详细表
订单编号 商品id 购买数量
-------------------------------------------------------------------------------------
商品库存表
商品id 库存数量 库存锁定数量 限购数量
-------------------------------------------------------------------------------------
A商品库存 50个
用户1 下单45个
用户2 下单20个
业务场景及解决方式:
用户1和用户2可能同时点击支付按钮,此时对于商品锁定库存来说只能有一个用户会锁定A商品的库存,剩下一个肯定锁定失败,此时应该提示其中一个用户(库存可能不足,请稍后再试),这里更新库存减扣应该都有前置条件的或者说版本号
另一个用户跳转到三方支付界面,
如果此用户取消支付,客户端应该发送一条消息告诉服务端恢复库存锁定,
如果此用户支付成功,客户端应该发送一条消息告诉服务端确认减扣库存,
客户端可能因某种情况发送失败,此时要考虑使用定时任务恢复超过多久库存还处于(根据锁定状态)锁定中的订单商品库存,应该先调用支付系统关闭原有未完成支付的订单,然后再恢复商品锁定库存
支付系统异步通知支付成功修改库存,此时根据库存锁定状态进行不同的业务处理(1库存已锁定 2库存已释放 3库存已确认,库存减扣成功)
当然如果是秒杀促销业务应该是下单即锁定库存
步骤虽然繁琐但是却可以解决库存减扣的问题
以上实现方式主要是最近公司开发的一个电商系统而想到的解决方案,该方案主要参考了淘宝的下单支付,如有不妥请指出
优点:可以解决库存减扣问题
缺点:体验差,如果只下单未付款,库存被锁定,让有意愿购买的用户无从下单,对销售业务有很大影响;
方案2:支付时锁定库存
下面主要讲解支付锁定库存的的实现步骤,以下是使用到的关键表
订单表
订单唯一编号 库存锁定状态(1库存已锁定 2库存已释放 3库存已确认,库存减扣成功)
-------------------------------------------------------------------------------------
订单详细表
订单编号 商品id 购买数量
-------------------------------------------------------------------------------------
商品库存表
商品id 库存数量 库存锁定数量 限购数量
-------------------------------------------------------------------------------------
A商品库存 50个
用户1 下单45个
用户2 下单20个
业务场景及解决方式:
用户1和用户2可能同时点击支付按钮,此时对于商品锁定库存来说只能有一个用户会锁定A商品的库存,剩下一个肯定锁定失败,此时应该提示其中一个用户(库存可能不足,请稍后再试),这里更新库存减扣应该都有前置条件的或者说版本号
另一个用户跳转到三方支付界面,
如果此用户取消支付,客户端应该发送一条消息告诉服务端恢复库存锁定,
如果此用户支付成功,客户端应该发送一条消息告诉服务端确认减扣库存,
客户端可能因某种情况发送失败,此时要考虑使用定时任务恢复超过多久库存还处于(根据锁定状态)锁定中的订单商品库存,应该先调用支付系统关闭原有未完成支付的订单,然后再恢复商品锁定库存
支付系统异步通知支付成功修改库存,此时根据库存锁定状态进行不同的业务处理(1库存已锁定 2库存已释放 3库存已确认,库存减扣成功)
当然如果是秒杀促销业务应该是下单即锁定库存
步骤虽然繁琐但是却可以解决库存减扣的问题
以上实现方式主要是最近公司开发的一个电商系统而想到的解决方案,该方案主要参考了淘宝的下单支付,如有不妥请指出