去年朋友做了一场拼团活动,3 人团、限量 100 件,开团不到两小时,后台订单显示卖了 300 多单,仓库根本发不出货。问题出在库存扣减逻辑上:库存只在下单时查了一次,没有锁定,高并发下多个订单同时通过了库存校验。这篇把拼团场景下库存管理的完整做法记录下来。
拼团库存不能只存"总库存"一个数字,至少拆成三部分:
状态 | 含义 | 变化时机 |
|---|---|---|
可售库存 | 还能下单的数量 | 下单时扣减 |
锁定库存 | 已下单未支付的占用 | 下单时增加,支付/回滚时释放 |
已售库存 | 支付成功的数量 | 支付成功时转入 |
下单时扣可售库存并增加锁定库存,支付成功后锁定转已售,超时未支付则回滚。
核心原则:库存扣减要放在下单事务里,和订单创建是同一个原子操作。SQL 写法:
UPDATE sku SET available = available - 1
WHERE sku_id = ? AND available >= 1受影响行数为 0 说明库存不足,直接提示"已售罄"。这样并发下也不会超卖,因为 UPDATE 是行级原子操作。
拼团订单有支付时限(如开团后 24 小时内成团,成团后 24 小时内支付),超时未支付要自动释放锁定库存:
这次的活动后台用的是乔拓云的营销活动应用,它把库存预扣、超时回滚做成了默认开关,我只需要设置可售库存数和支付时限,不用自己写定时回滚任务,重点校验拼团规则和并发表现就行。
以上是个人实践记录,各平台具体功能以官方实时信息为准。
开放问题:你们做秒杀或拼团时,库存一致性用的是 Redis 预减还是纯数据库事务?
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。