Mysql 意向锁到底是什么?

409 阅读2分钟

一、意向锁是什么?

意向锁有意向排他锁和意向共享锁。

在粒度上属于表锁,可以与行锁共存。

二、怎么添加意向锁?

意向锁无需手动添加,在添加行锁前,会该行所在的表添加对应的意向锁。

三、意向锁的作用是什么?

意向锁是表级别的锁,用来标识该表上有数据被锁住或即将被锁,对于表级别的请求(LOCK TABLE…),就可以直接判断是否有锁冲突,不需要逐行检查锁的状态。

简单来说就是,对于加表级锁时的速度进行优化——

我们可以把意向锁理解为一种标识,表示这个表中的某行存在排他锁或共享锁。

A表中的某行存在排他锁时,A表则有意向排他锁;共享锁同理。

在其他事务想要获得A表级的排他锁时,会先去检测A表的意向排他锁,存在则阻塞。

因为A表有意向排他锁这个标识的存在,避免了寻找A表中行级排他锁的行为,节约了资源。

四、意向锁的兼容互斥性

理解意向锁的作用之后,对于兼容互斥性的问题理解起来会非常简单。

在共享锁和排他锁的兼容互斥规则上,延展开来——

1、A表存在意向排他锁,

无加表级排他锁,可以加行级排他锁。

无法加表级共享锁,可以加行级共享锁。

2、A表存在意向共享锁,

可以加表级共享锁,可以加行级共享锁。

无法加表级排他锁,可以加行级排他锁。

五、总结:

1、意向锁与行级的共享锁、排他锁都不冲突,具体是否能加行级锁还是要看该行是否存在锁。

2、意向锁与表级锁的兼容互斥规则,沿用共享、排他锁的兼容互斥规则。

3、意向锁就是一种特殊的、不和行锁冲突的表锁。