讲师中心 微信公众号
AI工具推荐 视频效率加速

在phpMyAdmin中执行带锁读SQL时怎么避免阻塞

冬丽大大_2704

冬丽大大_2704

发布时间:2026-10-17 09:10:34

|

946人浏览过

|

来源于php中文网

原创

SELECT ... FOR UPDATE 会阻塞其他事务,因其在InnoDB中加排他锁且未提交前不释放;应确保走主键/唯一索引、及时提交、避免在phpMyAdmin中长时间持有锁。

在phpmyadmin中执行带锁读sql时怎么避免阻塞

SELECT ... FOR UPDATE 为什么会阻塞其他事务

在 InnoDB 中,SELECT ... FOR UPDATE 不是“读操作”,而是显式加排他锁(X锁)的写前准备动作。它会锁定扫描到的索引记录(或间隙、临键锁),只要事务未提交,这些锁就一直持有。其他事务若尝试对同一行做 UPDATE、DELETE 或再次 FOR UPDATE,就会被挂起等待——这就是阻塞的根源。

常见误判是认为“我只是查一下”,但加了 FOR UPDATE 就等于占着资源说“我要改”,数据库必须保障隔离性,不会让别人动。

  • RR(可重复读)隔离级别下,默认用 Next-Key Lock,可能锁住记录+间隙,范围比预期更大
  • 没走索引的 FOR UPDATE 会升级为全表扫描+全表加锁,阻塞面极广
  • 长事务中迟迟不 COMMIT,等于长期霸占锁,下游所有依赖该行的操作都会排队

怎么写 FOR UPDATE 才不容易拖垮别人

核心原则:锁得少、锁得准、放得快。不是不用 FOR UPDATE,而是让它只做它该做的事。

  • 确保 WHERE 条件命中**主键或唯一索引**,避免全表扫描;执行前用 EXPLAIN 确认 type 是 const 或 eq_ref
  • 只 SELECT 必需字段,不要 SELECT *——虽然不影响锁范围,但减少网络和内存开销,间接缩短事务时间
  • 紧跟 FOR UPDATE 后立刻做 UPDATE/DELETE,然后马上 COMMIT;不要在中间穿插 HTTP 请求、日志打印、远程调用等耗时操作
  • 如果只是防并发读取旧值(比如查余额后扣减),且业务允许短暂不一致,可改用 SELECT ... LOCK IN SHARE MODE + 应用层 CAS 逻辑,降低冲突概率

phpMyAdmin 里执行带锁语句的实操红线

phpMyAdmin 本身不提供事务自动提交开关,所有 SQL 都在默认 autocommit=1 下单条执行——但这恰恰是陷阱:你手动输 BEGIN; SELECT ... FOR UPDATE; 后,如果不主动点「提交」按钮或输 COMMIT,事务就一直开着,锁就一直挂着。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

立即学习“PHP免费学习笔记(深入)”;

  • 别依赖 phpMyAdmin 的「刷新页面」来结束事务:页面刷新不等于 COMMIT,锁还在
  • 执行 FOR UPDATE 前,先在 SQL 标签页里跑一遍 SELECT 确认数据存在且符合预期,避免因条件不匹配导致空锁或误锁
  • 生产环境严禁在 phpMyAdmin 里执行带锁语句后离开;临时调试务必配 SET innodb_lock_wait_timeout = 3; 缩短等待上限,防止无限卡死
  • 如需批量处理,绝不要写循环 FOR UPDATE → UPDATE → COMMIT;应合并为单条 UPDATE ... WHERE id IN (...),由 MySQL 内部优化锁粒度

真要高并发防超卖,别只靠 FOR UPDATE

单靠 FOR UPDATE 在秒杀类场景下极易成为瓶颈:锁竞争激烈、事务排队、响应延迟飙升。它适合低频、强一致性要求的场景(如银行转账),不适合高频写入。

  • 优先考虑应用层预扣减(Redis 计数器)+ 最终一致性校验,把压力从 DB 搬到缓存
  • 数据库侧可用「乐观锁」:加 version 字段,UPDATE ... SET stock = stock - 1, version = version + 1 WHERE id = ? AND version = ?,失败则重试
  • 极端情况用「分段库存」:把一个商品拆成 10 个逻辑子库存,分散锁竞争,再由应用聚合最终结果

真正容易被忽略的是:FOR UPDATE 的阻塞往往不是语句本身写错了,而是它嵌套在了一个本不该由 phpMyAdmin 承担的业务流程里——比如把订单创建、库存扣减、日志落库全压在一个手动事务里。这种操作在生产环境里,相当于拿手术刀给核反应堆调参数。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

10884

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6361

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2135

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

4008

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4734

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3711

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5317

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4162

2023.11.13

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn