一文聊聊Mysql锁的内部实现机制

文 / @WordPress主题

本文主要讲述了Mysql锁的内部实现机制,Mysql中支持行锁和表锁两种锁,其中行锁采用页的粒度组织管理,通过 spaceid、pagenumber 两个必要条件确定唯一一个数据页,n_bits 表示描述该页行锁信息需要多少bit位。同一数据页中每条记录都分配唯一的连续的递增序号:heap_no,若要知道某一行记录是否上锁,则只需要判断位图 heap_no 位置的数字是否为一即可。

Innodb还支持表锁,表锁可分为两大类:意向锁、自增锁。事务中锁的描述则根据每个事务每个页(或表)来定义,但是一个事务往往涉及到多个页,因此需要链表 trx_locks 串联起一个事务相关的所有锁信息。除了需要根据事务查询到所有锁信息,实际场景还要求系统必须能够快速高效的检测出某个行记录是否已经上锁,因此必须有一个全局变量支持对行记录进行锁信息的查询。Innodb选择了哈希表,其定义包括了 mutex、rec_hash、wait_mutex、waiting_threads、last_slot、rollback_complete、n_lock_max_wait_time、timeout_event、timeout_thread_active 等属性。

锁维护以页的粒度,锁的开销很小,某一事务对任一行上锁的开销都是一样的,锁数量的上升也不会带来额外的内存消耗。每个事务都对应一个 trx_t 的内存对象,其中保存着该事务锁信息链表和正在等待的锁信息。因此存在如下两种途径对锁进行查询:根据事务和根据记录。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。