发布时间:2021-05-14 10:18:46 阅读次数:112
本篇我们解读一些Mysql锁中的意向锁。
什么是意向锁?
顾名思义,意向锁就是有意向添加锁,意向锁分为共享意向锁(IS)和排它意向锁(IX),意向锁是为了使多粒度级别的锁更实用,Mysql引入了意向锁,意向锁是表级锁,它用来表示一个事务以后想要对表中的一行添加哪种类型的锁(共享锁或排他锁)。
意向共享锁(IS):指的是一个事务想要在表中的某个数据行上添加S锁。
意向排它锁(IX):指的是一个事务想要在表中的某个数据行上添加X锁。
意向锁有以下两个规定:
一个事务在获得某个数据行对象的S锁之前,必须先获取表的IS锁或者更强的锁。一个事务再获得某个数据行对象的X锁之前,必须先获得表的IX锁。意向锁解决了什么?
当存在行级锁和表级锁的时候,如果这时事务T想要对表A加X锁,就需要先检测是否有其他事务对表A或者表A中的任意一行加了锁,那么就需要对表A中的每一行都检测一次,这就非常耗时。
通过引入了意向锁,事务T想要对表A加X锁,只需要检测是否有其他事务对表A加了X/IX/IS锁就行了,如果加了就表示有其它事务正在使用这个表或者表中的某一行的锁,因此事务T加X锁失败。
各种锁的兼容关系
锁之前的兼容关系如下图:
任意IS、IX锁之间都是兼容的,因为它们只是表示想要加锁,而不是真正的加锁。这里的兼容关系针对的是表级锁,而表级的IX锁和行级的X锁兼容,两个事务可以对两个数据行加X锁(事务T1想要对数据行R1加X锁,事务T2想要对同一个表的数据行R2加X锁,两个事务都需要对该表加IX锁,但是IX锁是兼容的,并且IX锁与行级的X锁也是兼容的,因此两个事务都能加锁成功,对同一个表中的两个数据行做修改。)