外观
mysql 意向锁原理,作用?
⭐ 题目日期:
阿里 - 2024/8/21
📝 题解:
MySQL 意向锁的原理与作用
原理:
意向锁(Intention Lock)是 MySQL InnoDB 引擎实现多粒度锁机制的核心组件,分为意向共享锁(IS)和意向排他锁(IX)。其核心原理是通过在表级别标记事务的锁意图,从而高效协调表锁与行锁的兼容性。具体规则如下:
多粒度锁协调
- 事务在操作行级锁(S/X 锁)前,需先在表级申请对应的意向锁(IS/IX)。
- 例如:
SELECT ... FOR SHARE
会加 IS 锁(后续行加 S 锁)。UPDATE
会加 IX 锁(后续行加 X 锁)。
锁兼容性矩阵
请求锁类型\现有锁类型 IS IX S X IS 兼容 ✅ 兼容 ✅ 兼容 ✅ 不兼容 ❌ IX 兼容 ✅ 兼容 ✅ 不兼容 ❌ 不兼容 ❌ S 兼容 ✅ 不兼容 ❌ 兼容 ✅ 不兼容 ❌ X 不兼容 ❌ 不兼容 ❌ 不兼容 ❌ 不兼容 ❌
作用:
高效冲突检测
- 当事务尝试加表锁(如
LOCK TABLES ... WRITE
)时,只需检查表级意向锁,无需逐行扫描,大幅减少锁冲突判断开销。
- 当事务尝试加表锁(如
支持多粒度并发
- 场景示例:
- 事务 A 对行 R1 加 X 锁(表级 IX),事务 B 对行 R2 加 X 锁(表级 IX)。
- 两者 IX 锁兼容,允许并发修改不同行,提升吞吐量。
- 场景示例:
避免锁升级死锁
- 典型问题:事务 A 持有行锁,事务 B 请求表锁时,若无意向锁,可能误判无冲突直接加表锁,导致数据不一致。
- 解决方案:通过 IX 锁阻塞表锁请求,强制事务 B 等待行锁释放。
实战示例:
-- 事务A(更新某行,触发IX锁)
BEGIN;
UPDATE users SET age=30 WHERE id=1; -- 表级IX + 行级X锁
-- 事务B(尝试加表级S锁)
LOCK TABLES users READ; -- 检查到IX锁与S锁不兼容,阻塞等待
设计意义:
意向锁通过分层锁机制(表级意向锁 + 行级细粒度锁),在保证数据一致性的前提下,最大化并发性能。其本质是以极小的表级锁开销,换取行级锁的高效管理,成为 InnoDB 高并发事务处理的基石。