1. 首页
  2. >
  3. 数据库技术
  4. >
  5. MySQL

MySQL innodb意向锁介绍

大家知道,InnoDB 实现了标准的行级锁,包括:共享锁(S锁)、排它锁(X锁)。那么为什么需要引入意向锁呢?它能解决什么问题呢?

假设,事务A获取了某一行的排它锁,尚未提交,此时事务B想要获取表锁时,必须要确认表的每一行都不存在排他锁,很明显效率会很低,引入意向锁之后,效率就会大为改善:

  1. 如果事务A获取了某一行的排它锁,实际此表存在两种锁,表中某一行的排他锁和表上的意向排他锁。
  2. 如果事务B试图在该表级别上加锁时,则受到上一个意向锁的阻塞,它在锁定该表前不必检查各个页或行锁,而只需检查表上的意向锁。

打个比方,就像有个游乐场,很多小朋友进去玩,看门大爷如果要下班锁门,他必须确保每个角落都要去检查一遍,确保每个小朋友都离开了,才可以锁门。假设锁门是件频繁发生的事情,大爷就会非常崩溃。那大爷想了一个办法,每个小朋友进入,就把自己的名字写在本子上,小朋友离开,就把自己的名字划掉,那大爷就能方便掌握有没有小朋友在游乐场里,不必每个角落都去寻找一遍。例子中的“小本子”,就是意向锁,他记录的信息并不精细,不会记下小明是在玩木马还是在玩蹦床,他只是提醒大爷,小明在屋里。

为了让大家更宏观区分锁的这几个概念,我们先放上这张脑图:

MySQL innodb意向锁介绍

从锁粒度角度讲,InnoDB 允许行级锁与表级锁共存,而意向锁是表锁;从锁模式角度看,意向锁是一种独立类型,辅助解决记录锁效率不及的问题;从兼容性角度,意向锁包含了共享/排他两种。

最后,我们总结下意向锁的几个特征:

(1) 意向锁是表锁。做兼容性比照时,一定要分清是表锁还是行锁,如下图所示:

兼容性

IS

IX

S

X

IS

兼容

兼容

兼容

不兼容

IX

兼容

兼容

不兼容

不兼容

S

兼容

不兼容

兼容

不兼容

X

不兼容

不兼容

不兼容

不兼容

这里的排他(X)、共享(S)锁,说的是表锁。表级锁不会和行级锁做比较,这里特别容易混淆。

(2) 用户无法操作意向锁,意向锁是由InnoDB自己维护的。说白了,意向锁是帮助InnoDB提高效率的一种手段。

(3) 笔者感觉,意向锁(Intention Locks)概念不能深入人心,主要是名字起得不好,体现不出“表级”的概念,从字面理解看,“意向锁”三个字让人误以为是准备加锁,却还在排队处理的一种中间态。