为什么MySQL的意向锁(IS/IX)能提高多粒度锁定检查效率?

秋墨酱_6633

秋墨酱_6633

2026-06-21

713人浏览

原创

意向锁(is/ix)是innodb自动加的表级轻量标记,用于避免表锁检查时逐行扫描行锁,大幅提升冲突检测效率;is由select lock in share mode触发,ix由insert/update/delete/select for update触发,二者互不阻塞但均与表级x锁冲突。

为什么mysql的意向锁(is/ix)能提高多粒度锁定检查效率?

表锁检查不扫行,只看意向锁标记

因为逐行检查行锁是否冲突太慢。一张千万行的表,LOCK TABLES t WRITE如果真去遍历每一行判断有没有 SELECT FOR UPDATE 或 UPDATE 正在持有的 X 锁,光检测就可能卡住几秒——意向锁就是为绕过这一步而生的。

IS/IX 是 InnoDB 自动在表级别加的轻量标记,不锁数据、不阻塞行操作,只表达“我接下来要对某些行加 S/X 锁”的意图。其他事务申请表锁时,只需查表上有没有冲突的意向锁,就能立刻决定是成功还是等待。

  • 有 IX 锁 → 拒绝 LOCK TABLES t WRITE 和 LOCK TABLES t READ
  • 有 IS 锁 → 允许 LOCK TABLES t READ,但拒绝 LOCK TABLES t WRITE
  • IS 和 IX 并存 → 完全允许,互不阻塞(这是高并发能成立的前提)

哪些语句会触发 IS 或 IX 锁?

你写 SQL 时不显式加,InnoDB 在执行前自动加;但必须清楚谁带出什么锁,否则查不出阻塞根源。

  • SELECT ... LOCK IN SHARE MODE → 触发 IS 锁(同时对命中行加 S 锁)
  • SELECT ... FOR UPDATE、INSERT、UPDATE、DELETE → 触发 IX 锁(同时对命中行加 X 锁)
  • 没走索引的 DML(如 UPDATE t SET a=1 WHERE b='x' 且 b 无索引)→ 仍加 IX,但会对全表每行加 X 行锁,效果接近“伪表锁”

注意:IX 锁长期存在 ≠ 意向锁本身有问题,大概率是背后事务没提交、SQL 执行慢、或锁了不该锁的范围。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

为什么 IS 和 IX 彼此兼容,却都和表级 X 锁冲突?

意向锁本质是“声明”,不是“占有”。IS 说“我打算读几行”,IX 说“我打算改几行”,它们不矛盾,所以可以共存;但表级 X 锁意味着“整张表归我独占”,和任何“有人想动里面某几行”的声明天然冲突。

这个设计让多粒度锁真正可行:行锁可并发,表锁可快速判定是否安全,二者不打架。

  • 兼容性判断只发生在“意向锁 vs 表锁”之间,不是“意向锁 vs 行锁”
  • IS 和 IX 都不阻塞行级 S/X 锁,只影响更高层的表锁请求
  • 监控时单看 performance_schema.data_locks 中的 IS/IX 记录没用,得结合 INFORMATION_SCHEMA.INNODB_TRX 看事务状态,否则容易把网络超时或应用层未 COMMIT 误判成锁问题

ALTER TABLE 卡住?先查 IX 锁是否残留

线上 ALTER TABLE 长时间卡住,90% 是因为有未提交事务正持有 IX 锁,导致 DDL 拿不到表级排他锁。

  • MySQL 5.7 默认关闭 performance_schema,需启动时加 --performance-schema=ON
  • MySQL 8.0+ 默认开启,但查 data_locks 表需要 PROCESS 权限
  • 执行 SELECT object_schema,object_name,lock_type,lock_mode FROM performance_schema.data_locks WHERE lock_type = 'TABLE',重点看 lock_mode 是否为 IX,再关联 INNODB_TRX 找出对应事务

真正难处理的不是意向锁本身,而是它背后暴露的事务生命周期问题:长事务、慢查询、没索引的 DML、应用层忘记 COMMIT —— 这些才是实际要盯死的地方。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

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

下载

相关标签:

mysql

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

相关专题

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

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

2023.10.12

4023

8

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

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

2023.10.27

851

4

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

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

2024.02.23

1049

5

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

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

2024.03.06

5881

10

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

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

2024.03.06

2803

4

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

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

2024.04.07

5860

11

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

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

2024.04.29

7801

6

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

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

2024.04.29

1070

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

932

5

热门下载

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

精品课程

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

共1课时 | 180人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 287人学习