MySQL UPDATE ... SET stock = stock - 1 WHERE stock > 0;是原子性的吗?

UPDATE ... SET stock = stock - 1 WHERE stock > 0在 InnoDB 引擎下是原子性的但仅限于单行操作
这是实现高并发库存扣减的核心机制之一但需正确使用才能避免超卖


一、原子性原理:InnoDB 的行级锁保障

🔒1. 行级锁(Row-Level Locking)
  • UPDATE语句自动对匹配行加排他锁(X Lock);
  • 其他事务无法同时修改同一行
  • 流程
    1. 事务 A 执行UPDATE→ 锁住stock
    2. 事务 B 执行UPDATE→ 等待事务 A 提交
    3. 事务 A 提交 → 事务 B 读取最新stock
📜2. 原子性保证
  • stock = stock - 1是单条 SQLInnoDB 保证其原子执行
  • 不会出现
    • 两个事务同时读取stock=10
    • 都写回stock=9
  • 结果stock从 10 → 9 → 8(正确);

单行UPDATE是原子的


二、并发安全:为什么它能防超卖?

🧪场景:100 并发扣减库存
-- 初始 stock = 10UPDATEitemsSETstock=stock-1WHEREid=1ANDstock>0;
  • 安全原因
    • WHERE stock > 0+ 行锁 → 仅当库存 > 0 时才扣减
    • 第 11 次请求 →stock=0WHERE不匹配 → 影响行数 = 0
  • PHP 验证
    $affected=$pdo->exec("UPDATE items SET stock = stock - 1 WHERE id = 1 AND stock > 0");if($affected===0){thrownewException("库存不足");}
📊性能 vs 安全
方案原子性性能适用场景
UPDATE ... stock - 1✅ 单行原子⚠️ 中(行锁)核心库存
Redis Lua✅ 单命令原子✅ 高高并发场景
SELECT FOR UPDATE✅ 事务原子❌ 低(长事务)复杂业务

💡UPDATE原子扣减是 MySQL 层最轻量的一致性方案


3. 陷阱场景:何时会失效?

🚫陷阱 1:无WHERE stock > 0
-- 危险!库存可能变负UPDATEitemsSETstock=stock-1WHEREid=1;
  • 后果stock从 0 → -1 → 超卖
  • 解法必须加stock > 0条件
🚫陷阱 2:多行更新
-- 非原子!多行更新可能部分成功UPDATEitemsSETstock=stock-1WHEREidIN(1,2);
  • 后果id=1 成功,id=2 失败 → 数据不一致
  • 解法单行更新 + 事务
🚫陷阱 3:非 InnoDB 引擎
  • MyISAM表级锁 → 并发极低,且无事务
  • 解法必须用 InnoDB
🚫陷阱 4:未检查 affected_rows
  • 问题UPDATE成功但未扣减stock=0);
  • 解法必须检查affected_rows > 0

四、最佳实践:安全库存扣减

1. 单行原子扣减
functiondeductStock($pdo,$itemId):bool{$sql="UPDATE items SET stock = stock - 1 WHERE id = ? AND stock > 0";$stmt=$pdo->prepare($sql);$stmt->execute([$itemId]);return$stmt->rowCount()>0;// 检查是否成功扣减}
2. 事务兜底(复杂场景)
$pdo->beginTransaction();try{// 1. 扣库存if(!deductStock($pdo,123)){thrownewException("库存不足");}// 2. 创建订单createOrder($pdo,$userId,123);$pdo->commit();}catch(Exception$e){$pdo->rollBack();throw$e;}
3. 高并发优化
  • 方案Redis 预扣 + MySQL 最终一致
  • 流程
    1. Redis Lua 扣减
    2. 成功 → 消息队列 → MySQL 扣减
    3. 对账任务修复不一致

五、高危误区

🚫 误区 1:UPDATE总是原子的”
  • 真相
    • 仅单行UPDATE原子
    • 多行UPDATE非原子
  • 解法单行操作 + 事务
🚫 误区 2:“InnoDB 自动防超卖”
  • 真相
    • 必须加stock > 0条件
  • 解法WHERE条件是安全关键
🚫 误区 3:“affected_rows 可忽略”
  • 真相
    • affected_rows = 0= 扣减失败
  • 解法必须检查返回值

六、终极心法:原子性是条件的产物

不要假设“SQL 自动安全”,
而要设计“条件 + 锁 + 验证”的三重防护

  • 脆弱代码
    • UPDATE stock = stock - 1→ 超卖
  • 韧性代码
    • UPDATE ... WHERE stock > 0+affected_rows→ 安全
  • 结果
    • 前者是事故,后者是保障

真正的数据一致性,
不在“引擎多强”,
而在“条件多准”


七、行动建议:今日库存安全验证

## 2025-10-28 库存安全验证 ### 1. 检查现有 UPDATE - [ ] 是否包含 WHERE stock > 0 ### 2. 验证 affected_rows - [ ] 扣减后检查 rowCount() > 0 ### 3. 压测验证 - [ ] wrk -t10 -c100 → 验证无超卖 ### 4. 对比 Redis 方案 - [ ] 高并发下 Redis + MySQL 混合方案

完成即构建高可靠库存系统

当你停止用“UPDATE 能跑”定义安全,
开始用“条件 + 验证”设计逻辑,
库存就从风险,
变为可靠

这,才是专业 PHP 工程师的一致性观。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1128143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【必学收藏】LangChain LangGraph从零实战:构建大模型智能体全流程指南

基本概念 相信大家相比于LangGraph,LangChain能更熟悉一些,毕竟LangChain出现的更早,下面先来简单介绍下这两个框架。 LangChain:它是一个开发AI应用的基础框架,主要提供了开发AI应用的各种接口和工具,例如…

地理NLP极速入门:一小时搭建MGeo地址匹配Demo

地理NLP极速入门:一小时搭建MGeo地址匹配Demo 作为一名转行AI的产品经理,你可能经常需要验证地理语言模型在实际业务中的应用场景,但复杂的开发环境搭建往往让人望而却步。本文将带你使用预置的MGeo镜像,在一小时内快速搭建地址匹…

MGeo对比实验:BERT/SimCSE在地址匹配中的表现

MGeo对比实验:BERT/SimCSE在地址匹配中的表现 地址匹配是地理信息系统和位置服务中的核心任务,它直接影响着导航精度、物流配送效率和位置搜索体验。本文将通过对比实验,分析BERT和SimCSE两种预训练模型在地址匹配任务中的表现差异&#xff0…

ue live link 配置

确认 Live Link 源已连接:ue 5.6版本打开 窗口(Window) -> 虚拟制片(Virtual Production) -> Live Link。ue5.1 编辑,项目设置,插件里面,选择live link(不是这里&a…

零基础理解ConcurrentHashMap的线程安全原理

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 制作一个ConcurrentHashMap入门教程项目,包含:1) 分段锁机制的动画演示;2) 简单代码示例展示基础操作;3) 常见错误用法警示。要求使…

GPU资源闲置?用MGeo构建地址处理批处理服务创收

利用闲置GPU服务器构建MGeo地址批处理服务的技术实践 为什么选择MGeo处理地址数据 大学实验室常面临GPU服务器闲置的问题,而地址数据处理是许多企业和机构的高频需求。MGeo作为达摩院与高德联合研发的多模态地理文本预训练模型,能够高效完成地址标准化、…

从Excel到智能地址:MGeo数据处理自动化流水线

从Excel到智能地址:MGeo数据处理自动化流水线实战指南 作为一名地产公司的数据分析师,每月手动处理数万条Excel中的非标准地址数据,不仅效率低下还容易出错。本文将带你通过MGeo模型构建自动化地址处理流水线,实现从原始Excel到标…

AI助力Charles抓包分析:自动解析网络请求数据

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个AI辅助的Charles抓包分析工具,能够自动解析HTTP/HTTPS请求和响应数据。主要功能包括:1. 自动识别和分类API端点 2. 智能解析JSON/XML响应结构 3. 标…

收藏必备!AI大模型面试通关秘籍:五大核心领域精选问题与深度解析

引言 – 你是否正在寻找一份AI工程师、数据科学家、机器学习工程师,甚至是数据工程师的工作?或者,你只是想刷新一下知识、学习点新东西?无论如何,你都将进入这个激动人心(又有点令人生畏)的AI…

一篇文章快速了解Tauri应用

你想了解Tauri应用背后的核心技术体系,以及Tauri本身作为开发框架的技术特点,对吧? 一、Tauri 核心定义 Tauri 是一个跨平台桌面应用开发框架,核心目标是让开发者用 Web 技术(HTML/CSS/JS/TS 任意前端框架&#xff09…

15分钟原型开发:WUB音效创意验证平台

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个极简的WUB音效混搭实验台,允许用户:1. 选择基础音色(3种) 2. 叠加WUB效果强度(0-100%) 3. 混合其他音乐风格元素(可选2种) 4. 实时播放结果 5. 一键…

毕业设计救星:1小时搭建带可视化界面的MGeo实验平台

毕业设计救星:1小时搭建带可视化界面的MGeo实验平台 作为一名即将面临开题答辩的本科生,如果你的选题涉及地址智能解析却卡在环境配置阶段,这篇文章就是为你准备的。MGeo作为达摩院与高德联合推出的地理地址自然语言处理模型,能高…

手把手部署私有RAG知识库!基于Qwen2/Llama3 + Docker + AnythingLLM,企业级方案附避坑指南,建议收藏!

自 ChatGPT 发布以来,大型语言模型(Large Language Model,LLM,大模型)得到了飞速发展,它在处理复杂任务、增强自然语言理解和生成类人文本等方面的能力让人惊叹,几乎各行各业均可从中获益。 然…

零基础玩转地址实体对齐:基于MGeo的云端解决方案

零基础玩转地址实体对齐:基于MGeo的云端解决方案 在政务系统开发中,经常需要处理来自不同来源的地址数据,这些数据往往存在格式不统一、表述差异等问题。本文将介绍如何利用MGeo模型快速实现地址实体对齐,无需担心复杂的NLP模型部…

初学者必备:5款最适合新手的IDE推荐

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 列举并比较5款适合初学者的IDE(如VS Code、PyCharm等),要求提供安装指南、基本功能演示和常见问题解答,帮助新手快速入门。点击项目…

告别手动编码:NODEPAD下载效率提升300%的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 制作一个对比演示:1. 传统方式:手动编写Python文件下载代码(含异常处理、进度显示);2. AI辅助方式:通过自然…

1小时搞定BUCK-BOOST原型:快马平台实测

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 在快马平台实现BUCK-BOOST快速原型开发:1. 输入规格24V转5V/3A;2. 自动生成LTspice仿真文件;3. 输出PCB Gerber文件;4. 提供STM32控…

Plane看板视图完整指南:如何高效管理你的项目任务

Plane看板视图完整指南:如何高效管理你的项目任务 【免费下载链接】plane 🔥 🔥 🔥 Open Source JIRA, Linear and Height Alternative. Plane helps you track your issues, epics, and product roadmaps in the simplest way po…

用AI自动生成拉普拉斯变换代码,提升数学建模效率

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Python程序,使用SymPy库实现拉普拉斯变换的自动化计算。要求:1) 支持用户输入时域函数表达式 2) 自动计算并显示拉普拉斯变换结果 3) 提供常见函数…

实战:SQL注入测试与防御

SQL注入为何仍是测试核心战场?在2026年的软件安全生态中,尽管现代开发框架普遍内置了安全机制,SQL注入(SQL Injection, SQLi)仍稳居OWASP Top 10漏洞榜单首位,占比超过27%。对软件测试从业者而言&#xff0…