MySQL数据库 意向锁(初篇)

MySQL数据库 意向锁(初篇)

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


一、为什么需要意向锁?

InnoDB 同时支持:

  • 表锁
  • 行锁

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

👉 意向锁的作用

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


二、意向锁的类型

InnoDB 有 两种意向锁

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

三、意向锁的工作机制

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

  • 加行级共享锁(S)前

    → 先在表上加 IS 锁

  • 加行级排他锁(X)前

    → 先在表上加 IX 锁

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


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

IS IX S X
IS
IX
S
X

📌 关键理解:

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

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

示例 1:行锁 + 意向锁

sql 复制代码
START TRANSACTION;
SELECT * FROM user WHERE id = 1 FOR UPDATE;

发生的事情:

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

示例 2:表锁检测冲突

sql 复制代码
LOCK TABLE user WRITE;

MySQL 只需检查:

  • user 表上是否存在 IS / IX

如果存在 IX ,说明有事务在改某些行

➡️ WRITE 表锁不能加,直接阻塞或失败


五、意向锁的特点总结

✅ 意向锁是 表级锁

✅ 由 InnoDB 自动加锁与释放

✅ 不会阻塞 行锁之间的并发

✅ 用于 快速判断表锁与行锁是否冲突

✅ 是 多粒度锁(Multi-Granularity Locking) 的核心机制


六、一句话总结

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

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

若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/156236633

相关推荐
老邓计算机毕设11 小时前
SSM心理健康系统84459(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·心理健康系统·在线咨询
碎像11 小时前
10分钟搞定 MySQL 通过Binlog 数据备份和恢复
数据库·mysql
+VX:Fegn089511 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
win x11 小时前
Redis 分布式锁
数据库·redis·分布式
2501_9445210011 小时前
rn_for_openharmony商城项目app实战-商品评价实现
javascript·数据库·react native·react.js·ecmascript·harmonyos
冉冰学姐11 小时前
SSM心理健康系统59q3n(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·心理健康系统·心理文章
heartbeat..12 小时前
零基础学 SQL:DQL/DML/DDL/DCL 核心知识点汇总(附带连接云服务器数据库教程)
java·服务器·数据库·sql
傻啦嘿哟12 小时前
Python中的@property:优雅控制类成员访问的魔法
前端·数据库·python
岁岁种桃花儿13 小时前
MySQL 8.0 基本数据类型全面解析
数据库·mysql·数据库开发
用户4270074583813 小时前
第二节:使用Mongoose连接数据库
数据库