电商库存扣减

方案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.

想到了再补充

### 电商系统中分布式环境下的下单与扣减库存最佳实践 #### 使用分布式事务管理库存和订单的一致性 为了确保在高并发情况下不会发生超卖现象,同时保持订单创建与库存减少操作之间的一致性,在设计上可以考虑采用两阶段提交协议或是更轻量级的消息驱动模式。对于后者而言,RocketMQ 提供了一种可靠的机制来同步不同微服务之间的状态变化[^4]。 当用户发起购买请求时: - 应用程序会向消息中间件发送一条预占位通知; - 接收到确认之后再正式记录新产生的销售条目到数据库里; - 如果后续发现任何问题(例如支付环节出现问题),可以通过回滚机制撤销之前所做的更改;反之,则继续推进流程直至完成整个交易过程。 此方法能够有效防止因网络波动等原因造成的不一致状况,并且支持跨多个数据中心部署的应用场景。 #### 数据库层面的原子化更新策略 针对直接作用于持久层的数据变更动作——即实际意义上的“扣款”,应当遵循ACID原则并尽可能缩短锁定时间窗口以提高性能表现。具体做法如下所示[^3]: ```sql UPDATE product SET stock = stock - ? WHERE id = ? AND stock >= ? ``` 上述SQL片段展示了怎样利用条件判断语句(`WHERE`)配合乐观锁技术(通过比较当前剩余数量),从而避免了传统查询后再修改所带来的风险隐患。它保证每次只会影响符合条件的那一部分记录,即使面对大量并发访问也能维持较高的准确性水平。 另外值得注意的是,为了避免长时间持有表级别的排他权限影响其他业务逻辑正常运转,建议尽量缩小涉及范围内的资源粒度至最小单元级别。 #### Redis辅助实现高效的缓存控制 考虑到某些热点商品可能会频繁遭遇抢购行为进而给后台服务器带来巨大压力,此时引入内存型NoSQL存储作为前置缓冲就显得尤为必要了。借助Redis强大的数据结构特性及其内置命令集,不仅可以快速响应前端页面展示需求,而且还能协助完成初步筛选工作减轻主库负担。 例如设置带有过期时间属性的商品详情副本,每当有新的变动产生便及时刷新对应版本号以便客户端获取最新资讯;与此同时还可以在此基础上构建简单的计数器用于统计已售出份数,一旦触及警戒线立即触发预警提醒相关人员采取相应措施加以应对。 综上所述,一套完善的电子商务平台应该综合运用多种手段保障用户体验的同时兼顾内部运营效率的最大化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值