前面已经给大家分享了Mysql中有哪些锁、锁的分类以及相互间的兼容性。本节继续分享Mysql的加锁流程。
由于InnoDB引擎才支持行级锁,以下内容都是基于InnoDB引擎介绍。
对一条记录加锁本质上是内存中创建的一个锁结构跟这条记录相关联。
所以锁本质上就是内存中的一种数据结构。
那么我们在操作一个事务的时候,如果对应多条记录,是不是要针对多条记录生成多个内存的锁结构呢?比如我们执行select * from tb_user for update的时候,tb_user表中如果存在1万条数,那么难道要生成1万个内存的锁结构吗?那当然不会是这样的。其实,如果符合以下几个条件,那么这些记录的锁就可以放到一个内存中的锁结构里了,条件如下所示:
那么这么多次的锁结构,它到底是怎么组成的呢?
主要是由6部分组成的。分别为:锁所在的事务信息、索引信息、表锁或行锁信息、type_mode、其他信息、与heap_no对应的比特位。如下图所示:

锁所在的事务信息
一个锁结构对应一个事务,那么这里就存储着锁对应的事务信息。它其实只是一个指针,可以通过它获取到内存中关于该事务的更多信息,比如:事务id是多少。
索引信息
对于行级锁来说,这里记录的就是加锁的记录属于哪个索引。
表锁/行锁信息
(1)、对于表锁,主要是来记录对哪张表进行的加锁操作以及其他的信息。
(2)、对于行锁,内容包括3部分:
Space ID:记录所在的表空间ID。
Page Number:记录所在的页号。
n_bits:一条记录对应一个bit
type_mode
它是由32个bit组成的,分别为:lock_mode、lock_type、lock_wait和rec_lock_type,如下图所示:
