Skip to content

mysql 意向锁原理,作用?

约 568 字大约 2 分钟

MySQL阿里

2025-4-7

⭐ 题目日期:

阿里 - 2024/8/21

📝 题解:

MySQL 意向锁的原理与作用

原理:
意向锁(Intention Lock)是 MySQL InnoDB 引擎实现多粒度锁机制的核心组件,分为意向共享锁(IS)意向排他锁(IX)。其核心原理是通过在表级别标记事务的锁意图,从而高效协调表锁与行锁的兼容性。具体规则如下:

  1. 多粒度锁协调

    • 事务在操作行级锁(S/X 锁)前,需先在表级申请对应的意向锁(IS/IX)。
    • 例如:
      • SELECT ... FOR SHARE 会加 IS 锁(后续行加 S 锁)。
      • UPDATE 会加 IX 锁(后续行加 X 锁)。
  2. 锁兼容性矩阵

    请求锁类型\现有锁类型ISIXSX
    IS兼容 ✅兼容 ✅兼容 ✅不兼容 ❌
    IX兼容 ✅兼容 ✅不兼容 ❌不兼容 ❌
    S兼容 ✅不兼容 ❌兼容 ✅不兼容 ❌
    X不兼容 ❌不兼容 ❌不兼容 ❌不兼容 ❌

作用:

  1. 高效冲突检测

    • 当事务尝试加表锁(如 LOCK TABLES ... WRITE)时,只需检查表级意向锁,无需逐行扫描,大幅减少锁冲突判断开销。
  2. 支持多粒度并发

    • 场景示例
      • 事务 A 对行 R1 加 X 锁(表级 IX),事务 B 对行 R2 加 X 锁(表级 IX)。
      • 两者 IX 锁兼容,允许并发修改不同行,提升吞吐量。
  3. 避免锁升级死锁

    • 典型问题:事务 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 高并发事务处理的基石。