源码家族
当前位置:首页 > 资讯中心

资讯中心

【 Mysql锁之意向锁简介 】

发布时间: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锁也是兼容的,因此两个事务都能加锁成功,对同一个表中的两个数据行做修改。)


上一篇:HTTP协议会被IPFS取代吗