意向锁的核心作用是让表锁和行锁高效共存,避免加表锁时全表扫描检查行锁状态;innodb自动在表级加is/ix锁标记行锁意图,仅与表锁冲突,不阻塞其他意向锁,本质是优化性能的元数据路标。

意向锁的核心作用是让表锁和行锁能高效共存,避免加表锁时做全表扫描检查行锁状态。
解决“查一行就要扫全表”的性能问题
没有意向锁时,事务想对整张表加写锁(LOCK TABLES ... WRITE),数据库必须逐行检查是否已被其他事务加了行锁——1000万行就得检查1000万次。意向锁把这一步简化成一次判断:只要看到表上有 IS 或 IX 锁,就立刻知道“表里肯定有行被锁了”,直接阻塞或拒绝加表锁。
自动标记行锁意图,无需人工干预
InnoDB 在执行任何带锁的行操作前,会自动在表级加上对应的意向锁:
- 执行 SELECT ... LOCK IN SHARE MODE → 自动加 IS 锁
- 执行 UPDATE/DELETE/SELECT ... FOR UPDATE → 自动加 IX 锁
- 执行 LOCK TABLES ... READ/WRITE → 检查表上是否有 IS/IX 锁,有则冲突
协调规则简单清晰
意向锁本身不阻塞其他意向锁,只和真正的表锁产生兼容性判断:
- IS 和 IX 之间完全兼容(多个事务可同时读/写不同行)
- IS 与表级 X 锁 冲突(有人在读行,就不能整表写)
- IX 与表级 S 锁 冲突(有人在改行,就不能整表读一致快照)
- 表级 X 锁 与所有意向锁都冲突(整表独占,不容任何行级操作)
本质是元数据“路标”,不是业务锁
它不控制数据访问权限,也不参与事务隔离级别的实现,纯粹是引擎内部的优化机制。开发者只需关注业务层面的锁语句(如 FOR UPDATE、LOCK IN SHARE MODE、LOCK TABLES),InnoDB 会默默在背后加上合适的意向锁来保障效率与正确性。











