暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

MySQL锁的内存结构

Ty3306 2022-09-24
808



结构解析:

1. 锁所在的事务信息:

不论是表锁还是行锁,都是在事务执行过程中生成的,哪个事务生成了这个 锁结构 ,这里就记录这个事务的信息。

此锁所在的事务信息在内存结构中只是一个指针,通过指针可以找到内存中关于该事务的更多信息,比方说事务id等。

2. 索引信息:

对于行锁来说,需要记录一下加锁的记录是属于哪个索引的。这里也是一个指针。

3. 表锁/行锁信息:

表锁结构和行锁结构在这个位置的内容是不同的:

表锁:记载着是对哪个表加的锁,还有其他的一些信息。
行锁:记载了三个重要的信息:
Space ID :记录所在表空间。
Page Number :记录所在页号。
n_bits :对于行锁来说,一条记录就对应着一个比特位,一个页面中包含很多记录,用不同的比特位来区分到底是哪一条记录加了锁。为此在行锁结构的末尾放置了一堆比特位,这个n_bits 属性代表使用了多少比特位。
n_bits的值一般都比页面中记录条数多一些。主要是为了之后在页面中插入了新记录后也不至于重新分配锁结构

4. type_mode:

这是一个32位的数,被分成了lock_mode、lock_type和rec_lock_type三个部分

锁的模式(lock_mode),占用低4位,可选的值如下:
LOCK_IS(十进制的0):表示共享意向锁,也就是IS锁。
LOCK_IX(十进制的1):表示独占意向锁,也就是IX锁。
LOCK_S(十进制的2):表示共享锁,也就是S锁。
LOCK_X(十进制的3):表示独占锁,也就是X锁。
LOCK_AUTO_INC(十进制的4):表示AUTO-INC锁。
在InnoDB存储引擎中,LOCK_IS,LOCK_IX,LOCK_AUTO_INC都算是表级锁的模式,LOCK_S和 LOCK_X既可以算是表级锁的模式,也可以是行级锁的模式。

锁的类型(lock_type),占用第5~8位,不过现阶段只有第5位和第6位被使用:
LOCK_TABLE(十进制的16),也就是当第5个比特位置为1时,表示表级锁。
LOCK_REC(十进制的32),也就是当第6个比特位置为1时,表示行级锁。
行锁的具体类型(rec_lock_type),使用其余的位来表示。只有在 lock_type的值为LOCK_REC时,也就是只有在该锁为行级锁时,才会被细分为更多的类型:
LOCK_ORDINARY(十进制的0):表示next-key锁。
LOCK_GAP(十进制的512):也就是当第10个比特位置为1时,表示gap锁。
LOCK_REC_NOT_GAP(十进制的1024):也就是当第11个比特位置为1时,表示正经记录锁。
LOCK_INSERT_INTENTION(十进制的2048):也就是当第12个比特位置为1时,表示插入意向锁。其他的类型:还有一些不常用的类型我们就不多说了。
is_waiting属性呢?基于内存空间的节省,所以把 is_waiting 属性放到了 type_mode 这个32位的数字中:
LOCK_WAIT(十进制的256) :当第9个比特位置为1时,表示is_waiting为true,也就是当前事务尚未获取到锁,处在等待状态;当这个比特位为0时,表示is_waiting为false,也就是当前事务获取锁成功。
5. 其他信息:

为了更好的管理系统运行过程中生成的各种锁结构而设计了各种哈希表和链表。

6. 一堆比特位:

如果是行锁结构的话,在该结构末尾还放置了一堆比特位,比特位的数量是由上边提到的n_bits属性表示的。InnoDB数据页中的每条记录在记录头信息中都包含一个 heap_no 属性,伪记录Infimum的heap_no值为0,Supremum的heap_no值为1,之后每插入一条记录,heap_no值就增1。锁结构最后的一堆比特位就对应着一个页面中的记录,一个比特位映射一个heap_no,即一个比特位映射到页内的一条记录。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论