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

mysql中的锁机制:行级锁与表级锁

陌芳酱_2941

陌芳酱_2941

发布时间:2026-01-31 09:41:02

|

801人浏览过

|

来源于php中文网

原创

InnoDB支持行级锁而MyISAM仅支持表级锁;行锁实际作用于索引记录,无索引时会退化为表锁;死锁自动检测并回滚,需通过SHOW ENGINE INNODB STATUS或开启innodb_print_all_deadlocks分析。

mysql中的锁机制:行级锁与表级锁

行级锁只在 InnoDB 有效,MyISAM 根本不支持

MySQL 的锁机制和存储引擎强绑定。InnoDB 支持行级锁(SELECT ... FOR UPDATE、UPDATE、DELETE 等语句默认加行锁),而 MyISAM 只支持表级锁(所有 DML 操作都锁整张表)。如果你执行了 SELECT ... FOR UPDATE 却没生效——先查 SHOW CREATE TABLE tbl_name,确认引擎是不是 ENGINE=InnoDB。

常见错误现象:

  • 在 MyISAM 表上执行 SELECT ... FOR UPDATE 不报错,但实际无锁效果(语句成功,锁未建立)
  • 事务中更新某几行后,其他事务仍能修改同一张 MyISAM 表的任意行(因为根本没行锁)
  • 误以为加了索引就自动用行锁——其实 InnoDB 行锁是加在索引记录上的,若 WHERE 条件无法命中索引,会退化为表级锁(锁全表所有索引项,等效于锁表)

行锁不是“锁住某行数据”,而是锁住索引记录

InnoDB 的行级锁本质是锁住聚簇索引或二级索引中的记录。这意味着:

  • UPDATE users SET name='a' WHERE id = 100:如果 id 是主键,则锁住聚簇索引中 id=100 的那条记录
  • UPDATE users SET name='a' WHERE email='x@y.z':如果 email 有唯一索引,则锁住该二级索引记录 + 对应的聚簇索引记录(next-key lock)
  • UPDATE users SET name='a' WHERE status = 1:若 status 无索引,InnoDB 会扫描全表,对每条匹配记录加锁,同时可能触发间隙锁(gap lock)或临键锁(next-key lock),导致大量无关行被锁定

容易踩的坑:用 EXPLAIN 看执行计划,确认 type 是否为 const/ref;如果是 ALL 或 index,大概率已丧失行锁粒度。

表级锁不只是 LOCK TABLES,隐式锁更常见

显式表锁(LOCK TABLES t1 WRITE)极少在业务代码中使用,但隐式表级锁频繁出现:

SSL Certificate Monitor
SSL Certificate Monitor

检查一个或多个域名的 SSL/TLS 证书到期时间、颁发者、协议及 SAN 信息,用于应要求检查证书、监控到期或验证 HTTPS 等场景。

下载
  • ALTER TABLE 在大多数 MySQL 版本中会获取元数据锁(MDL),阻塞后续 DML,本质是表级协调锁
  • MyISAM 执行 INSERT 时自动加表写锁,此时任何读(SELECT)都会等待
  • InnoDB 在某些 DDL 场景下(如无 ALGORITHM=INPLACE 的列添加)也会升级为表级锁
  • FLUSH TABLES WITH READ LOCK 是全局表级读锁,常用于物理备份,但会阻塞所有写入

性能影响明显:一个慢 ALTER TABLE 可能让整个库的写请求排队,监控时注意 show processlist 中状态为 Waiting for table metadata lock 的线程。

死锁检测与日志怎么看

InnoDB 死锁检测是自动开启的(innodb_deadlock_detect=ON),一旦发生,MySQL 会选一个事务回滚并返回错误:

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

要定位原因,必须开死锁日志:

  • 设置 innodb_print_all_deadlocks = ON(写入 error log,非实时输出)
  • 或执行 SHOW ENGINE INNODB STATUS\G,查看 LATEST DETECTED DEADLOCK 区域

日志里关键信息包括:

  • 每个事务持有的锁(HELD LOCKS)
  • 正在等待的锁(WAITING FOR THIS LOCK TO BE GRANTED)
  • 涉及的表名、索引名、具体记录的主键值(如 space id 123 page no 1024 n bits 72 后跟 record lock, heap no 5)

真正难处理的是“锁等待链过长”而非死锁:比如事务 A 锁住行 X,事务 B 等 A;B 又锁住行 Y,事务 C 等 B……这种不会触发死锁检测,但会导致请求堆积,需靠 information_schema.INNODB_TRX 和 INNODB_LOCK_WAITS 关联分析。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

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

豆包大模型

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

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

相关专题

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

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

2353

2023.06.20

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

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

1439

2023.06.21

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

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

855

2023.07.18

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

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

3292

2023.07.19

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

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

5628

2023.07.25

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

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

1239

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

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

5891

2023.08.11

mysql忘记密码
mysql忘记密码

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

5122

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

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

精品课程

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

共1课时 | 191人学习

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

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