mysql意向锁是做什么的_mysql锁协作机制说明

发布时间 - 2026-01-10 00:00:00    点击率:
意向锁是InnoDB多粒度锁机制的基础设施,事务执行SELECT...FOR UPDATE或LOCK IN SHARE MODE时自动在表级加IX或IS锁,用于快速判断表中是否存在行锁,避免全表扫描行锁状态。

意向锁是用来避免全表扫描行锁状态的“预告灯”

当事务想对某几行加 S 锁(SELECT ... LOCK IN SHARE MODE)或 X 锁(SELECT ... FOR UPDATE)时,InnoDB 会**自动先在表级别加一个意向锁**:加行共享锁前加 IS 锁,加行排他锁前加 IX 锁。这不是你手动加的,也拦不住——它由引擎隐式维护,只为一个目的:让表级锁能快速判断“这表里有没有行正被锁着”

没有意向锁时,另一个事务想对整张表加 X 锁(比如 ALTER TABLE 或某些显式 LOCK TABLES ... WRITE),就得逐行检查是否被其他事务持有行锁——大表上这等于拒绝并发。

  • ISIX 本身互不冲突,可以并存(多个读/写事务可同时声明意图)
  • IS 与表级 X 锁冲突 → 表明“有人正在读部分行”,整表写必须等
  • IX 与表级 S 锁冲突 → 表明“有人正准备写部分行”,整表读也不安全
  • 全表扫描类操作(如没走索引的 UPDATE)可能触发 IX + 行锁升级,但意向锁本身从不阻塞任何操作——真正阻塞的是后续的表锁申请

什么时候你会“感知到”意向锁的存在

你不会直接看到 ISIX 出现在 SHOW ENGINE INNODB STATUS 的 LOCK WAIT 段里(它只显示最终阻塞链),但你能通过现象反推:

  • 执行 SELECT ... FOR UPDATE 后,另一个会话尝试 LOCK TABLES t1 WRITE 卡住 → 很可能是因为表上有未释放的 IX 锁(即前一个事务还没提交)
  • 事务 A 执行了 SELECT ... LOCK IN SHARE MODE,事务 B 紧接着执行 ALTER TABLE t1 ADD COLUMN c INT 被挂起 → 是因为 IS 锁和 DDL 需要的 X 表锁冲突
  • information_schema.INNODB_TRX 里查不到锁类型字段,但 INNODB_LOCK_WAITS 显示等待对象是表名而非行,基本就是意向锁引发的表级等待

常见误判:以为“没加表锁就没事”,其实意向锁早埋伏好了

很多开发者以为自己只操作单行、用了主键条件、没写 LOCK TABLES,就完全不涉及表级语义——错。只要用了悲观锁语法,意向锁就已生效:

-- session-01
BEGIN;
SELECT * FROM users WHERE id = 100 FOR UPDATE;  -- 自动加 IX 锁(表级)+ X 锁(行级)
-- 此时 users 表已有 IX 锁,哪怕只锁了一行
-- session-02
BEGIN;
LOCK TABLES users WRITE;  -- 立即阻塞:IX 和表级 WRITE 不兼容
  • 即使你用的是唯一索引或主键,只要语句带 FOR UPDATELOCK IN SHARE MODE,意向锁就触发
  • INSERT 也会触发 IX 锁(尤其涉及自增列时,还叠加自增锁)
  • 显式 LOCK TABLES ... READ/WRITE 是用户层表锁,和意向锁分属不同机制,但会受其约束——这是最容易混淆的一点

调试和验证意向锁行为的实操建议

想确认意向锁是否在起作用?别猜,用这几招直接观察:

  • performance_schema.data_locks(MySQL 8.0+):过滤 LOCK_DATA IS NULL AND LOCK_MODE LIKE '%INTENTION%',能看到 IS/IX 记录
  • SHOW ENGINE INNODB STATUS\GTRANSACTIONS 段末尾的 lock struct(s),注意 table lock 类型且 lock_modeISIX
  • 测试时务必用两个以上会话,并保持事务未提交——意向锁生命周期=事务生命周期
  • 注意隔离级别影响:在 READ COMMITTED 下,某些非唯一条件查询可能不加间隙锁,但意向锁依然存在

最常被忽略的是:意向锁不是“可选优化”,而是 InnoDB 多粒度锁机制的基础设施。你绕不开它,但可以靠减少长事务、避免无索引扫描、控制悲观锁使用范围来降低它的副作用。


# mysql  # session  # ai  # NULL  # for  # select  # int  # Struct  # 并发  # 对象  # column  # table  # 的是  # 是因为  # 用了  # 想对  # 基础设施  # 主键  # 表上  # 这是  # 也不  # 好了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Laravel如何处理CORS跨域请求?(配置示例)  如何用wdcp快速搭建高效网站?  米侠浏览器网页背景异常怎么办 米侠显示修复  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  如何快速搭建二级域名独立网站?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  动图在线制作网站有哪些,滑动动图图集怎么做?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  如何选择可靠的免备案建站服务器?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  javascript日期怎么处理_如何格式化输出  Laravel集合Collection怎么用_Laravel集合常用函数详解  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  iOS验证手机号的正则表达式  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Laravel如何升级到最新版本?(升级指南和步骤)  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何用AWS免费套餐快速搭建高效网站?  智能起名网站制作软件有哪些,制作logo的软件?  如何快速搭建个人网站并优化SEO?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何在Windows环境下新建FTP站点并设置权限?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  如何在阿里云ECS服务器部署织梦CMS网站?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何用免费手机建站系统零基础打造专业网站?  EditPlus中的正则表达式实战(6)  linux top下的 minerd 木马清除方法  如何用PHP快速搭建CMS系统?  如何在宝塔面板中修改默认建站目录?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  详解Android中Activity的四大启动模式实验简述  如何在万网开始建站?分步指南解析  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  如何将凡科建站内容保存为本地文件?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  如何快速选择适合个人网站的云服务器配置?