MySQL高并发下 SELECT ... FOR UPDATE 性能差的庖丁解牛
MySQL 高并发下SELECT ... FOR UPDATE性能差本质是行锁竞争 事务持有时间过长导致的锁等待与吞吐下降。它并非“不好用”而是在错误场景下被滥用。一、核心原理FOR UPDATE如何工作▶ 1.加锁机制InnoDB 行锁SELECT ... FOR UPDATE会对结果集所有行加排他锁X Lock其他事务无法读取若未开启 MVCC 快照读或修改这些行锁范围若无索引 →全表扫描 锁所有行灾难若有索引 →仅锁命中行▶ 2.事务生命周期MySQL事务2事务1MySQL事务2事务1BEGINSELECT * FROM seats WHERE id100 FOR UPDATE返回数据 加锁SELECT * FROM seats WHERE id100 FOR UPDATE阻塞等待 T1 释放锁COMMIT返回数据核心认知FOR UPDATE的性能 锁粒度 × 事务时长 × 并发度二、性能瓶颈三大致命问题▶ 1.锁粒度过大场景-- 无索引字段查询SELECT*FROMordersWHEREuser_id123FORUPDATE;后果全表扫描 → 锁住所有行即使只返回 1 行并发度 ≈ 1其他事务全部阻塞▶ 2.事务持有时间过长场景$pdo-beginTransaction();$seat$pdo-query(SELECT * FROM seats WHERE id100 FOR UPDATE)-fetch();// 调用第三方支付 API耗时 2 秒$paymentResultcallPaymentAPI($seat);if($paymentResult){$pdo-exec(UPDATE seats SET status2 WHERE id100);}$pdo-commit();后果行锁持有 2 秒 → 其他请求排队等待吞吐量从 1000 QPS 降至 50 QPS▶ 3.死锁风险场景事务 A 锁 seat 100 → 尝试锁 seat 101事务 B 锁 seat 101 → 尝试锁 seat 100后果MySQL 检测到死锁 → 回滚其中一个事务 → 重试成本高三、工程优化四层解决方案▶ 方案 1缩小锁粒度最有效必须为 WHERE 字段加索引-- 添加索引ALTERTABLEseatsADDINDEXidx_train_status(train_id,status);-- 优化查询SELECTidFROMseatsWHEREtrain_id100ANDstatus0LIMIT1FORUPDATE;-- 仅锁 1 行▶ 方案 2缩短事务时长两阶段提交// 阶段1锁定座位短事务$pdo-beginTransaction();$stmt$pdo-prepare(SELECT id FROM seats WHERE train_id? AND status0 LIMIT 1 FOR UPDATE);$stmt-execute([$trainId]);$seatId$stmt-fetchColumn();if($seatId){$pdo-exec(UPDATE seats SET status1 WHERE id?,[$seatId]);// 标记为已锁定}$pdo-commit();// 阶段2异步处理支付无锁if($seatId){dispatchPaymentJob($seatId);// 放入队列}▶ 方案 3无锁设计终极方案预分配座位池-- 余票计数表CREATETABLEtrain_inventory(train_idINTPRIMARYKEY,availableINTNOTNULL);原子扣减// 乐观锁扣减库存$stmt$pdo-prepare( UPDATE train_inventory SET available available - 1 WHERE train_id ? AND available 0 );if($stmt-execute([$trainId])$stmt-rowCount()0){// 分配具体座位无锁assignSeat($trainId);}▶ 方案 4Redis Lua 脚本超高并发Lua 脚本保证原子性-- check_and_lock.lualocalavailableredis.call(GET,KEYS[1])iftonumber(available)0thenredis.call(DECR,KEYS[1])return1endreturn0PHP 调用$locked$redis-eval(file_get_contents(check_and_lock.lua),[train:100:seats],1);四、避坑指南陷阱破局方案无索引使用 FOR UPDATE必须为 WHERE 字段加联合索引事务中调用外部 API用两阶段提交分离锁与业务逻辑盲目增加超时时间优化锁粒度比调大innodb_lock_wait_timeout更有效五、终极心法**“FOR UPDATE 不是枷锁而是精度的标尺——当你缩小粒度你在释放并发当你缩短持有你在提升吞吐当你拥抱无锁你在铸造韧性。真正的高并发始于对锁的敬畏成于对细节的精控。”结语从今天起所有FOR UPDATE查询必须有索引事务内禁止调用外部 API超高并发场景优先考虑 Redis 无锁方案因为最好的并发控制不是加更多锁而是精准控制每一比特的竞争。

相关新闻

React Native鸿蒙:DeviceInfo应用版本读取

React Native鸿蒙:DeviceInfo应用版本读取

好的,我将根据您提供的写作标准,为您撰写一篇关于在OpenHarmony平台上使用React Native DeviceInfo模块获取应用版本的技术文章。以下是文章大纲和核心内容规划: 文章大纲 摘要(100-150字)DeviceInfo 模块介绍 模块功…

2026/7/3 14:46:06 阅读更多 →
React Native鸿蒙版:KeyboardInteractive交互监听

React Native鸿蒙版:KeyboardInteractive交互监听

React Native for OpenHarmony 实战:KeyboardInteractive 键盘交互监听详解 摘要 本文深入探讨React Native在OpenHarmony 6.0.0平台上实现键盘交互监听的技术方案。文章详细解析了KeyboardInteractive组件的核心原理、在OpenHarmony 6.0.0 (API 20)环境下的适配策…

2026/7/3 14:46:08 阅读更多 →
『NAS』Typora平替,一款所见即所得的MD编辑器-Haptic

『NAS』Typora平替,一款所见即所得的MD编辑器-Haptic

点赞 关注 收藏 学会了 整理了一个NAS小专栏,有兴趣的工友可以关注一下 👉 《NAS邪修》 Haptic 是一款开源极简的 Markdown 编辑器区别于传统编辑器的 “编辑 / 预览分屏” 模式,它能实时渲染 Markdown 语法(输入即显示最终效果…

2026/7/4 13:07:44 阅读更多 →

最新新闻

2026年同声传译软件免费额度实测对比,差距竟然这么大谁才好用?

2026年同声传译软件免费额度实测对比,差距竟然这么大谁才好用?

先说结论:这类工具怎么选 没有万能的同声传译软件,2026年实测下来五款主流工具的免费额度差距确实超出预期。针对知识付费用户消化付费课程、整理播客内容、巩固学习效果的核心需求,不同工具的适配性完全不同。不要盲目追大厂,不…

2026/7/6 4:32:21 阅读更多 →
压榨机器,Hack,设计极限强度的网络应用

压榨机器,Hack,设计极限强度的网络应用

在《对话网友 - TCP一万连接系统设计》文后回复中,短短的评论不足以说明问题,于是单独撰文解释。 对于一般的应用来说,操作系统足以对付,对于极限应用来说,操作系统往往就成了我们的障碍,这里的障碍有两个意…

2026/7/6 4:32:20 阅读更多 →
基于LangGraph的Agentic RAG智能问答系统构建指南

基于LangGraph的Agentic RAG智能问答系统构建指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你正在准备 AI 大模型应用开发工程师的面试,或者想从零开始构建一个能真正落地的智能问答系统,那么这篇文…

2026/7/6 4:30:20 阅读更多 →
2026技术路线图模板,国自然青基高分热门技术路线图流程图ppt/word/visio模板合集 含ppt+word+Visio可编辑版,pdf和jpg参考学习速览版,共计399款

2026技术路线图模板,国自然青基高分热门技术路线图流程图ppt/word/visio模板合集 含ppt+word+Visio可编辑版,pdf和jpg参考学习速览版,共计399款

2026技术路线图模板,国自然青基高分热门技术路线图流程图ppt/word/visio模板合集 含pptwordVisio可编辑版,pdf和jpg参考学习速览版,共计399款 399款技术路线图模板含pptwordVisio可编辑版 提取码: ek4e 项目合集(项目不断更新中,包含java、vue、pyth…

2026/7/6 4:30:20 阅读更多 →
Codex、Cursor、GitHub Copilot 怎么选?2026 AI 编程工具横向对比与 Pro 升级建议

Codex、Cursor、GitHub Copilot 怎么选?2026 AI 编程工具横向对比与 Pro 升级建议

Codex、Cursor、GitHub Copilot 怎么选?2026 AI 编程工具横向对比与 Pro 升级建议 更新时间:2026 年 7 月 5 日。AI 编程产品的模型、套餐和额度变化很快,购买前请再次查看官方页面与产品内模型选择器。 “Codex、Cursor 和 GitHub Copilot 哪…

2026/7/6 4:26:19 阅读更多 →
Power BI DAX上下文与CALCULATE实战指南

Power BI DAX上下文与CALCULATE实战指南

1. 这不是“又一个DAX教程”——它是一份能让你在真实业务场景里立刻写出有效公式的生存指南Power BI DAX Tutorial for Beginners 这个标题背后藏着的,不是一套PPT式概念罗列,而是一群每天被销售漏斗断层、库存周转失真、客户复购率口径打架折磨得睡不着…

2026/7/6 4:24:19 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻