一文搞懂MySQL 数据库意向锁

 更新时间:2026年01月10日 11:20:27   作者:君九@DBA  
意向锁是InnoDB的多粒度锁机制中的一种关键机制,用于声明事务将对表中的某些行加行锁,从而在加表锁时避免扫描所有行锁,是InnoDB自动维护的表级锁,本文给大家介绍MySQL数据库意向锁,感兴趣的朋友跟随小编一起看看吧

在本篇开始阅读前,建议看下《MySQL数据库 意向锁(初篇)》章节,对意向所有个大概了解。

一、用“分层锁”的图示理解意向锁(核心)

InnoDB 使用的是 多粒度锁(Multi-Granularity Locking)

数据库
 └── 表(意向锁 IS / IX)
      └── 行(S / X)

规则一句话版

想锁行,必须先在表上“打个招呼”

示例:更新一行数据

START TRANSACTION;
UPDATE orders SET status = 'paid' WHERE id = 10;

锁的实际过程是:

1️⃣ 给 orders 表加 IX(意向排他锁)
2️⃣ 给 id = 10 这一行加 X(排他锁)

👉 意向锁 = “我打算动你表里的某些行”

二、为什么没有意向锁会很惨?

假设:没有意向锁

  • orders1000 万行
  • 事务 A:更新其中 1 行
  • 事务 B:想加表锁
LOCK TABLE orders WRITE;

😱 MySQL 只能:

  • 扫描 1000 万行
  • 看看有没有行锁

为此,就会引发:👉 性能灾难

有了意向锁之后

操作检查内容
行锁不管表锁
表锁只看 IS / IX

🚀 O(1) 判断是否冲突

三、意向锁 vs 表锁 vs 行锁(对比表)

锁类型级别是否阻塞行锁是否阻塞表锁
IS阻塞表 X
IX阻塞表 S / X
S行级互斥
X行级互斥
S(表)阻塞 IX阻塞 X
X(表)全阻塞全阻塞

📌 重点

意向锁几乎只和“表锁”打架,不和“行锁”打架

四、为什么 MyISAM 不需要意向锁?

MyISAM 的锁模型

  • ❌ 不支持行锁
  • ✅ 只有表锁
要么整张表读
要么整张表写

👉 不存在:

  • 行锁
  • 表锁与行锁并存
  • 自然 不需要意向锁

InnoDB 的优势(但更复杂)

存储引擎并发锁模型
MyISAM表锁
InnoDB行锁 + 意向锁

五、一个非常经典的死锁场景(面试常考)

场景描述

user

idname
1A
2B

事务 A

START TRANSACTION;
SELECT * FROM user WHERE id = 1 FOR UPDATE;

锁状态:

user 表:IX
id=1 行:X

事务 B

START TRANSACTION;
LOCK TABLE user WRITE;

B 想要:

user 表:X

❌ 但被 A 的 IX 阻塞

接着事务 A 再做:

SELECT * FROM user WHERE id = 2 FOR UPDATE;

此时:

  • A 等待表锁释放
  • B 等待 IX 消失

💥 死锁形成

👉 InnoDB 会:

  • 自动检测
  • 回滚其中一个事务

六、如何在生产中“看到”意向锁?

1️⃣ 查看当前锁(MySQL 8.0)

SELECT * FROM performance_schema.data_locks;

你会看到类似:

OBJECT_NAME = orders
LOCK_TYPE = TABLE
LOCK_MODE = IX

2️⃣ 常见 LOCK_MODE 含义

LOCK_MODE含义
IS意向共享
IX意向排他
S共享
X排他

七、一句话总结

意向锁是 InnoDB 自动维护的表级锁,用来声明事务将对表中的某些行加行锁,从而在加表锁时避免扫描所有行锁,是多粒度锁机制的关键。

到此这篇关于一文搞懂MySQL 数据库意向锁的文章就介绍到这了,更多相关mysql 数据库意向锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • mac安装mysql数据库及配置环境变量的图文教程

    mac安装mysql数据库及配置环境变量的图文教程

    本文主要介绍了mac安装mysql数据库及配置环境变量,文中通过图文代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • MySQL最左匹配原则详细分析

    MySQL最左匹配原则详细分析

    首先回顾一下什么是最左匹配(也有称之为最左前缀)?顾名思义:最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配
    2022-12-12
  • mysql 5.7.14 下载安装配置方法图文教程

    mysql 5.7.14 下载安装配置方法图文教程

    这篇文章主要为大家分享了mysql 5.7.14 下载安装配置方法图文教程,感兴趣的朋友可以参考一下
    2016-08-08
  • mysql 表维护与改造代码分享

    mysql 表维护与改造代码分享

    当数据库中表的数量比较多时,不利于维护,本文将以此问题进行详细介绍如何维护mysql表,与如何修改mysql表
    2012-11-11
  • MySQL重连连接丢失:The last packet successfully received from the server的原因及解决方案

    MySQL重连连接丢失:The last packet successfully 

    在开发和运维MySQL数据库应用时,经常会遇到“连接丢失”或“重连失败”的问题,这类问题不仅会影响应用程序的稳定性,还可能导致数据不一致等严重后果,本文将探讨MySQL连接丢失的原因、如何诊断此类问题以及采取哪些措施来解决或预防,需要的朋友可以参考下
    2025-02-02
  • MySQL安装报错找不到MSVCR120.dll文件丢失的解决方案

    MySQL安装报错找不到MSVCR120.dll文件丢失的解决方案

    文章介绍了解决MSVCR120.dll丢失问题的几种方法,包括重新安装Microsoft Visual C++ Redistributable、手动下载DLL文件、运行系统文件检查工具、检查系统更新以及卸载并重新安装相关软件
    2024-12-12
  • mysql优化连接数防止访问量过高的方法

    mysql优化连接数防止访问量过高的方法

    这篇文章主要介绍了mysql优化连接数防止访问量过高的方法,需要的朋友可以参考下
    2014-06-06
  • mysql 海量数据的存储和访问解决方案

    mysql 海量数据的存储和访问解决方案

    数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
    2010-05-05
  • 新手必学的mysql外键设置方式

    新手必学的mysql外键设置方式

    MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列,一个表可以有一个或多个外键,下面这篇文章主要给大家介绍了关于mysql外键设置的相关资料,需要的朋友可以参考下
    2021-12-12
  • 查看mysql语句运行时间的2种方法

    查看mysql语句运行时间的2种方法

    网站运行很慢的时候,我就特别起知道为什么这么慢,所以我查啊查,数据库绝对是很重要的一部分,里面运行的sql是绝对不能放过的。平时做项目的时候,我也会注意sql语句的书写,写出一些高效的sql来,所以我会经常测试自己写的sql语句。我把我知道的二个方法,总结一下发出来
    2014-01-01

最新评论