MySQL数据库意向锁超级入门篇

 更新时间:2026年01月10日 11:21:15   作者:君九@DBA  
意向锁(Intention Lock)是MySQL InnoDB存储引擎中的一种表级锁,用于提高锁冲突判断的效率,本文给大家介绍MySQL数据库 意向锁超级入门篇,感兴趣的朋友跟随小编一起看看吧

MySQL(主要是 InnoDB 存储引擎) 中,意向锁(Intention Lock) 是一种 表级锁,用来表示事务打算在表中的某些行上加什么类型的行锁,从而提高锁冲突判断的效率

一、为什么需要意向锁?

InnoDB 同时支持:

  • 表锁
  • 行锁

如果没有意向锁,当一个事务想给整张表加锁时,就必须 逐行检查是否有行锁存在,这在大表中会非常低效。

👉 意向锁的作用
让数据库 只需检查表级的意向锁,就能快速判断是否可以加表锁,而不必扫描整张表的行锁。

二、意向锁的类型

InnoDB 有 两种意向锁

意向锁类型含义
IS(Intention Shared Lock)表示事务打算在表中某些行上加 共享锁(S)
IX(Intention Exclusive Lock)表示事务打算在表中某些行上加 排他锁(X)

三、意向锁的工作机制

1️⃣ 加行锁前,先加意向锁(表级)

加行级共享锁(S)前
→ 先在表上加 IS 锁

加行级排他锁(X)前
→ 先在表上加 IX 锁

⚠️ 意向锁 不是用户显式加的,而是 InnoDB 自动维护的

2️⃣ 锁兼容关系(重点)

ISIXSX
IS
IX
S
X

📌 关键理解:

  • 多个事务可以同时持有 IS / IX
  • 表级 S / X 锁会与意向锁发生冲突
  • 意向锁之间几乎不冲突

四、举例说明(非常重要)

示例 1:行锁 + 意向锁

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

发生的事情:

  1. user 表上加 IX(意向排他锁)
  2. id = 1 这行上加 X(排他锁)

示例 2:表锁检测冲突

LOCK TABLE user WRITE;

MySQL 只需检查:

  • user 表上是否存在 IS / IX

如果存在 IX,说明有事务在改某些行
➡️ WRITE 表锁不能加,直接阻塞或失败

五、意向锁的特点总结

✅ 意向锁是 表级锁
✅ 由 InnoDB 自动加锁与释放
✅ 不会阻塞 行锁之间的并发
✅ 用于 快速判断表锁与行锁是否冲突
✅ 是 多粒度锁(Multi-Granularity Locking) 的核心机制

六、一句话总结

意向锁是 InnoDB 的一种表级锁,用来表明事务将要在表的某些行上加行锁,从而避免在加表锁时逐行检查行锁,提高锁冲突检测的效率。

推荐阅读《MySQL 数据库 意向锁 详解(白话篇:一看就懂)

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

相关文章

  • MySQL系列连载之XtraBackup 备份原理解析

    MySQL系列连载之XtraBackup 备份原理解析

    关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天本文推荐另一个备份工具innobackupex,重点给大家介绍XtraBackup 备份的相关知识,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • mysql插入带emoji表情的数据报错问题

    mysql插入带emoji表情的数据报错问题

    在处理MySQL数据库插入表情时出现错误,主要可能是由三个因素引起的:1、数据库版本号是否大于5.5.3;2、数据库表及字段的字符集是否为utf8mb4;3、项目中MySQL驱动的版本是否大于5.1.13,本文详细讲解了如何针对这三个关键点进行排查和解决
    2024-11-11
  • MySQL count()聚合函数详解

    MySQL count()聚合函数详解

    MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQL count()聚合函数,感兴趣的朋友一起看看吧
    2025-06-06
  • Mysql无法选取非聚合列的解决方法

    Mysql无法选取非聚合列的解决方法

    这篇文章主要给大家介绍了关于Mysql无法选取非聚合列的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • MySQL简化输入小技巧

    MySQL简化输入小技巧

    在这里我将介绍两个使用MySQL数据库时候简化输入的小技巧。
    2011-09-09
  • MySql InnoDB存储引擎之Buffer Pool运行原理讲解

    MySql InnoDB存储引擎之Buffer Pool运行原理讲解

    缓冲池是用于存储InnoDB表,索引和其他辅助缓冲区的缓存数据的内存区域。缓冲池的大小对于系统性能很重要。更大的缓冲池可以减少磁盘I/O来多次访问同一表数据。在专用数据库服务器上,可以将缓冲池大小设置为计算机物理内存大小的百分之80
    2023-01-01
  • VS2013连接MySQL5.6成功案例一枚

    VS2013连接MySQL5.6成功案例一枚

    这篇文章主要为大家分享了VS2013连接MySQL5.6成功案例一枚,很有实用性,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 解决Navicat for MySQL 连接 MySQL 报2005错误的问题

    解决Navicat for MySQL 连接 MySQL 报2005错误的问题

    在本地MySQL的服务启动后,由于Navicat的一些功能需要联网才可以使用,今天重点给大家介绍Navicat for MySQL 连接 MySQL 报2005 -Unknown MySQL server host ‘localhost’(0)错误的情况与解决方法,感兴趣的朋友一起看看吧
    2021-05-05
  • MySQL数据表的常见约束小结

    MySQL数据表的常见约束小结

    在数据库设计中,约束(Constraints)是用于确保数据的完整性、准确性和一致性的规则,MySQL 提供了多种约束类型,帮助我们规范数据存储,本文给大家介绍了MySQL数据表的常见约束,需要的朋友可以参考下
    2024-12-12
  • MySQL系列之十二 备份与恢复

    MySQL系列之十二 备份与恢复

    这篇文章主要介绍了MySQL 数据备份与还原的相关知识,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下,希望可以帮到你们
    2021-07-07

最新评论