0

0

mysql事务并发下如何扣减库存_mysql业务实现示例

P粉602998670

P粉602998670

发布时间:2026-02-12 14:13:38

|

952人浏览过

|

来源于php中文网

原创

select ... for update 可防止超卖,需满足innodb引擎和索引查询,配合update带库存校验条件、read committed隔离级及死锁重试机制。

mysql事务并发下如何扣减库存_mysql业务实现示例

SELECT ... FOR UPDATE 防止超卖

在并发扣减库存场景下,不加锁直接 UPDATE 极易导致超卖。核心做法是先查再锁再改:用 SELECT ... FOR UPDATE 在事务内锁定目标行,确保同一商品不会被多个事务同时修改。

注意必须满足两个前提:表引擎为 InnoDB;查询条件命中索引(如主键或唯一索引),否则会升级为表锁,严重拖慢性能。

  • 不要写 SELECT * FROM stock WHERE sku = 'A001' 后再判断,这中间存在竞态窗口
  • 务必把 SELECT ... FOR UPDATE 和后续 UPDATE 放在同一个事务中(BEGIN → 查询 → 更新 → COMMIT
  • 如果查询不到记录(sku 不存在),FOR UPDATE 不会报错,但后续 UPDATE 将影响 0 行,需主动检查 ROW_COUNT()

扣减逻辑必须带库存校验条件

仅靠行锁不能替代业务校验。即使锁住了某行,也得确认当前库存是否足够——否则可能扣成负数。正确方式是在 UPDATE 语句里直接写条件判断。

UPDATE stock 
SET quantity = quantity - 1 
WHERE sku = 'A001' AND quantity >= 1;

执行后检查 ROW_COUNT() 返回值:

  • 返回 1:扣减成功
  • 返回 0:库存不足或记录不存在,事务应主动回滚

避免先 SELECT quantityUPDATE,那又回到竞态问题。

一键职达
一键职达

AI全自动批量代投简历软件,自动浏览招聘网站从海量职位中用AI匹配职位并完成投递的全自动操作,真正实现'一键职达'的便捷体验。

下载

事务隔离级别建议用 READ COMMITTED

MySQL 默认是 REPEATABLE READ,它会使用间隙锁(Gap Lock)防止幻读,但在库存类场景中容易引发不必要的锁等待甚至死锁。而 READ COMMITTED 只锁实际命中的行,无间隙锁,更轻量。

设置方式(连接级):

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
  • 不需要全局改,应用在扣减库存的数据库连接池初始化时设置即可
  • 确认业务能接受“同一事务中两次读可能不一致”,这对下单这种短事务通常无影响
  • 如果已用 SELECT ... FOR UPDATEREAD COMMITTED 下锁行为更可预测,不易误锁相邻范围

别忽略连接超时和死锁重试机制

高并发下,FOR UPDATE 等待锁、网络延迟、事务过长都可能导致超时或死锁。MySQL 报错典型有:

  • Lock wait timeout exceededinnodb_lock_wait_timeout 触发)
  • Deadlock found when trying to get lock

应用层必须捕获这些错误并实现简单重试(比如最多 3 次),而不是直接抛给用户。伪代码逻辑:

for retry in range(3):
    try:
        BEGIN
        SELECT quantity FROM stock WHERE sku = ? FOR UPDATE;
        UPDATE stock SET quantity = quantity - 1 WHERE sku = ? AND quantity >= 1;
        COMMIT
        break
    except (DeadlockError, LockTimeoutError):
        time.sleep(0.05 * (2 ** retry))  # 指数退避
        continue

重试前强制断开并重建连接,避免复用处于异常状态的事务上下文。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

674

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

350

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

284

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

261

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

391

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

536

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

634

2023.08.14

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

189

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 831人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号