设计高并发库存系统需先明确防超卖机制,通过MySQL行级锁、乐观锁(version字段)和原子操作确保数据一致;库存表独立设计,包含总库存、可用库存、冻结库存及版本号字段;下单时扣减可用库存并增加冻结库存,支付后转为已售,取消或超时则释放冻结库存;推荐用消息队列异步处理状态流转,结合Redis缓存预减库存提升性能,同时分表分库应对热点商品,最终以MySQL为准保证一致性。

在高并发的电商系统中,商品库存管理是核心模块之一。设计不合理容易导致超卖、数据不一致等问题。本文结合 MySQL 实战经验,介绍如何设计一个稳定、可靠的库存系统。
库存信息通常单独建表,避免主商品表频繁更新影响性能。
基本字段包括:
示例SQL:
CREATE TABLE `product_stock` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `product_id` BIGINT NOT NULL UNIQUE, `total_stock` INT NOT NULL DEFAULT 0, `available_stock` INT NOT NULL DEFAULT 0, `frozen_stock` INT NOT NULL DEFAULT 0, `version` INT NOT NULL DEFAULT 0, `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_product_id (`product_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
在秒杀或抢购场景中,多个用户同时下单可能导致库存扣减错误。常用解决方案:
SELECT ... FOR UPDATE 锁定记录,确保串行执行。推荐写法(防超卖):
UPDATE product_stock
SET available_stock = available_stock - 1,
frozen_stock = frozen_stock + 1,
version = version + 1
WHERE product_id = ?
AND available_stock > 0
AND version = ?
执行后检查受影响行数,若为0说明库存不足或版本冲突,需提示用户。
真实业务中,库存不是简单减法。典型流程如下:
建议用消息队列(如RocketMQ)异步处理解冻和出库,避免事务过长。
例如订单超时未支付,触发定时任务或延迟消息:
UPDATE product_stock
SET available_stock = available_stock + 1,
frozen_stock = frozen_stock - 1
WHERE product_id = ?
AND frozen_stock > 0;
面对高并发请求,单一MySQL可能成为瓶颈。优化方向:
注意:缓存方案需处理好缓存穿透、击穿、雪崩问题,必要时加本地缓存+限流。
基本上就这些。库存系统看似简单,但细节决定成败。合理利用MySQL的事务、锁机制和原子操作,配合应用层控制,才能保障数据准确。实战中建议先做小流量验证,再逐步上线。
以上就是mysql中如何设计商品库存系统_mysql商品库存项目实战的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号