MySQL 核心模块揭秘 | 18 期 | 锁在内存里长什么样?

本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。

目录

  • 1. 共用的结构

  • 2. type_mode

  • 3. 表锁结构

  • 4. 行锁结构

    • 4.1 有名有姓的那些属性

    • 4.2 隐姓埋名的内存区域

    • 4.3 共用行锁结构的两个问题

  • 5. 总结

正文

1. 共用的结构

InnoDB 的表锁结构和行锁结构,有一些共同属性,也有一些不同属性。

因为有共同属性,表锁结构和行锁结构都使用结构体 lock_t
来表示锁结构。

在 lock_t 之下,又定义了 lock_table_t
lock_rec_t
分别包含表锁结构和行锁结构的不同属性。

为了更直观的理解表锁结构和行锁结构,我们去掉 lock_t
的一些非核心信息之后,整理如下:

// storage/innobase/include/lock0priv.h<br>struct lock_t {<br>  trx_t *trx;<br>  UT_LIST_NODE_T(lock_t) trx_locks;<br>  dict_index_t *index;<br>  lock_t *hash;<br>  union {<br>    lock_table_t tab_lock;<br>    lock_rec_t rec_lock;<br>  };<br>  uint32_t type_mode;<br>};<br>