MySQL 核心模块揭秘 | 19 期 | 锁模块里有什么?什么样?
本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。
目录
1. 引言
2. 锁模块结构
2.1 谁来管理行锁结构?
2.2 谁来保护表锁和行锁结构?
2.3 锁等待了怎么办?
2.4 那就发个锁等待通知
3. 总结
正文
1. 引言
前面三篇文章,我们分别介绍了 InnoDB 表锁、行锁,以及它们的锁结构。
表锁结构和行锁结构是锁模块的基础组成部分,它们就像一块砖,哪里需要哪里搬。
然而,要盖房子,光有砖不行,还得有钢筋、水泥等材料,这些材料就由锁模块结构提供。
锁模块结构只有一个对象(lock_sys
),在 InnoDB 中是全局唯一的。
2. 锁模块结构
锁模块结构类型为 lock_sys_t
,去掉注释以及两个无关紧要的属性之后,简化如下:
struct lock_sys_t {<br> locksys::Latches latches;<br> hash_table_t *rec_hash;<br> hash_table_t *prdt_hash;<br> hash_table_t *prdt_page_hash;<br> Lock_mutex wait_mutex;<br> srv_slot_t *waiting_threads;<br> srv_slot_t *last_slot;<br> bool rollback_complete;<br> std::chrono::steady_clock::duration n_lock_max_wait_time;<br> os_event_t timeout_event;<br>}<br>