0

0

mysql数据库锁的基本概念_mysql锁入门解析

P粉602998670

P粉602998670

发布时间:2026-02-03 09:01:35

|

341人浏览过

|

来源于php中文网

原创

锁的是索引项而非数据行;InnoDB行级锁实际作用于聚簇索引或二级索引记录,无索引时锁全表索引项,导致等效表锁。

mysql数据库锁的基本概念_mysql锁入门解析

锁到底锁的是什么?不是数据行,而是索引项

MySQL 的行级锁(尤其是 InnoDB)**不直接锁数据行,而是锁索引上的记录**。哪怕你没建任何索引,InnoDB 也会创建一个隐藏的聚簇索引(GEN_CLUST_INDEX),所有行锁都落在这个索引结构上。

这意味着:

  • 用主键(如 WHERE id = 100)更新,只在聚簇索引上加一把 X 锁;
  • 用二级索引(如 WHERE name = 'Alice')更新,则先在 name 索引上加 X 锁,再回表到聚簇索引上对对应主键加 X 锁——共两把锁;
  • 如果 WHERE 条件没走索引(例如 WHERE status+0 = 1LIKE '%abc'),InnoDB 无法精准定位,会退化为扫描全表,并对**每条匹配记录的聚簇索引项加锁**,极端情况下等效于锁整张表。

共享锁 vs 排他锁:什么时候该用 LOCK IN SHARE MODE

S 锁(共享锁)和 X 锁(排他锁)是底层基础,但日常开发中你几乎不会手动加 S 锁——除非你需要显式阻塞其他写操作,同时允许并发读。

典型场景是「防超卖」中的读-改-写闭环:

  • 普通 SELECT 是一致性读(MVCC),不加锁,可能读到旧库存;
  • SELECT stock FROM goods WHERE id = 123 LOCK IN SHARE MODE,能确保读到当前最新值,且阻止其他事务对这行加 X 锁(即不能扣减);
  • 后续紧跟 UPDATE goods SET stock = stock - 1 WHERE id = 123,此时已持有 S 锁,InnoDB 会自动升级为 X 锁完成更新;
  • 若跳过 LOCK IN SHARE MODE 直接 UPDATE,虽也加 X 锁,但中间存在窗口:两次请求可能同时读到 stock=1,然后都执行 -1 → 变成 -1。

别被“行锁”骗了:为什么 UPDATE 有时卡住整张表?

InnoDB 的“行锁”只是默认行为,**是否真锁单行,完全取决于执行计划是否命中索引**。

Glarity
Glarity

Glarity是一款免费开源的AI浏览器扩展,提供YouTube视频总结、网页摘要、写作工具等功能,支持免费的镜像翻译,电子邮件写作辅助,AI问答等功能。

下载

常见踩坑点:

  • UPDATE users SET status = 1 WHERE phone LIKE '%138%':无索引 + 模糊前缀 → 全表扫描 → 对每行聚簇索引加 X 锁 → 等效表锁;
  • UPDATE orders SET paid = 1 WHERE created_at > '2025-01-01':若 created_at 无索引,同样锁全表;
  • 复合查询中用了函数:WHERE DATE(create_time) = '2025-01-01' → 索引失效 → 锁范围扩大;
  • 即使有索引,若统计信息过期(ANALYZE TABLE 未执行),优化器也可能误判为全表扫描。

全局锁 FLUSH TABLES WITH READ LOCK 的真实代价

它确实能保证备份一致性,但代价是整个实例只读——所有 DML、DDL、甚至 COMMIT 都会被阻塞,业务写入直接挂起。

所以生产环境慎用,尤其高流量系统:

  • mysqldump --single-transaction 是更优解(依赖 MVCC,仅对 InnoDB 有效),它不加全局锁,靠事务快照保证一致性;
  • FLUSH TABLES WITH READ LOCK 主要用于 MyISAM 表或混合引擎库的备份;
  • 执行后必须配对 UNLOCK TABLES,否则锁一直挂着——曾有案例因忘记解锁,导致线上订单积压数小时;
  • 注意:它不阻塞 SELECT,但会阻塞任何修改元数据的操作(比如 ALTER TABLE),而这类操作常被运维后台静默触发。

锁机制不是黑盒,它的行为直接受索引设计、SQL 写法、隔离级别共同决定。最危险的不是锁本身,而是你以为加了行锁,实际锁了一片索引范围,甚至整张表。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

792

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

330

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

351

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1345

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

364

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

943

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

427

2024.04.29

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

89

2026.02.02

热门下载

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

精品课程

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

共48课时 | 2.1万人学习

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

共3课时 | 0.3万人学习

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

共1课时 | 821人学习

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

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