一文聊聊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 的内存对象,其中保存着该事务锁信息链表和正在等待的锁信息。因此存在如下两种途径对锁进行查询:根据事务和根据记录。

相关文章
-
MySQL Workbench怎么建立数据库(附:sql语句创建数据库方法) 2023-07-20 12:22:29
-
MySQL Workbench是什么?(附:如何设置中文教程) 2023-07-20 11:42:31
-
一起聊聊MySQL主从延时的处理方案 2023-05-14 07:00:03
-
mysql怎么将查询结果赋给变量 2023-05-14 07:00:03
-
mysql驱动是什么 2023-05-14 07:00:03
-
qt5.8如何连接mysql 2023-05-14 07:00:03
-
MySQL 语法整理介绍 2023-05-14 07:00:03
-
mysql修改表结构的语句是什么 2023-05-14 07:00:03
-
mysql乐观锁和悲观锁的区别是什么 2023-05-14 07:00:03
-
mysql查询怎么区分大小写 2023-05-14 07:00:02