什么是意向锁?
在 MySQL 中获取一个公共资源时,会先对该资源进行加锁操作,如果多个事务都是直接获取资源锁,就很可能出现互相阻塞问题,甚至是出现死锁问题。
比如说事务 A 针对 Test 表中的某行记录进行了加锁,此时该条记录只能读取不能修改。
如果同时事务 B 需要对 Test 表添加表级锁,那么就需要遍历 Test 表中的所有数据看是否存在事务已经针对该表记录添加了行级锁,逐行遍历就比较浪费资源,因此 MySQL 就针对该问题引入了意向锁机制。
当一个事物获取行级锁或表级锁时,MySQL 会自动获取相应表的意向锁,我们可以简单理解在表上有一个标志位,标志着是否已经有行级锁或者是表级锁了。
这样其他事务也想针对该表进行操作时,只需要先判断意向锁即可,就无需逐行遍历。
同时意向锁也分意向共享锁与意向排他锁。
- 意向共享锁(IS):在一个事务需要对表中某些行加共享锁(S锁)时,事务首先需要获得表的意向共享锁(IS锁)。
- 意向排他锁(IX):指的是在一个事务需要对表中某些行加排它锁(X锁)时,事务首先需要获得表的意向排它锁(IX锁)。
需要注意意向锁是一种辅助性的锁,用于协调表级锁和行级锁之间的关系,它并不直接加在数据记录上,而是加在表级别或页面级别上,用于指示事务接下来可能会对数据行进行何种类型的锁定操作。
