MySQL5.7 : Reduce lock_sys_t::mutex contention when converting implicit lock to an explicit lock

worklog: http://dev.mysql.com/worklog/task/?id=6899

Rev: http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/5743

背景:
1.什么是隐式锁
所谓的隐式锁,可以理解成一个记录标记,在内存的锁对象hash中是不存在的。但我们在更新数据块时,会进行如下操作:
#对于聚集索引,每次更改或插入记录会同时写入对应的事务id和回滚段指针
#对于二级索引,每次更改/插入二级索引记录,会更新二级索引页的最大事务id。

我们知道,Innodb在插入记录时,是不加锁的。如果事务A插入记录rec1,且未提交时。事务b尝试update rec1,这时候事务b会去判断rec1上保存的事务id是否活跃,如果活跃的话,那么就 “帮助” 事务A 去建立一个锁对象,加入到hash中,然后自身进入等待事务A状态,也就是所谓的隐式锁转换为显式锁。

该worklog主要优化了该转换的过程

原始逻辑
参考函数lock_rec_convert_impl_to_expl

0.找到修改或插入当前记录的事务id (记做trx_id, 不持有锁),如果不是活跃的事务id,不做操作,退出函数

1. Acquire the lock_sys_t::mutex
2. (trx_rw_is_active)
Acquire the trx_sys_t::mutex
Scan the trx_sys_t::rw_trx_list for trx_id_t (only RW transactions can insert)
Release the trx_sys_t::mutex
Return handle if transaction found
3. if handle found then
do an implicit to explicit record conversion
endif
4. Release the lock_sys_t::mutex

可以看到,在该操作的过程中,全程持有lock_sys mutex,持有锁的原因是防止事务提交掉.当读写事务链表非常长时(例如高并发写入时),这种开销将是不可接受的。

优化后的逻辑

Acquire the trx_sys_t::mutex
Scan the trx_sys_t::rw_trx_list for trx_id_t (only RW transactions can insert)
if handle found then
Acquire the trx_t::mutex
Increment trx_t::n_ref_count ——增加计数,表示对这个事务进行隐式锁转换
Release the trx_t::mutex
endif
Release the trx_sys_t::mutex
Return handle if transaction found
if handle found then
Acquire the lock_sys_t::mutex
do an implicit to explicit record conversion
Release the lock_sys_t::mutex
Acquire the trx_t::mutex
Decrement trx_t::n_ref_count ——完成隐式转换,重置计数
Release the trx_t::mutex
endif

这里实际上在查找当前记录上的活跃事务id时,直接返回的是其事务对象,而不是事务id

在事务commit时进行检查 (函数lock_trx_release_locks)
Acquire the trx_t::mutex
if trx_t::n_ref_count > 0
while (trx_t::n_ref_count > 0) ———>当前正在做隐式到显式的锁转换
Release the trx_t::mutex
sleep/delay
Acquire the trx_t::n_ref_count
end while
endif

通过该修改,我们可以在获取活跃事务对象的时候无需持有lock sys mutex。在低并发下,可能没有太多收益,但在高并发下,读写事务链表较长时,可能会影响到性能。

但该特性带来的额外开销是,事务在commit时需要检查ref count,理论上锁转换过程应该很快.

MySQL5.7 : 对隐式锁转换的优化相关推荐

  1. JUC-9.“锁”事(显式锁与隐式锁/悲观锁与乐观锁/公平锁与非公平锁/可重入锁/读写锁(独占/共享/降级)/邮戳锁/死锁)、锁升级

    目录 一.悲观锁与乐观锁 1.1 悲观锁 1.2 乐观锁 二.公平锁与非公平锁 2.1 为什么会有公平锁/非公平锁的设计为什么默认非公平? 2.2 如何选择使用哪种锁? 三.可重入锁(又名递归锁) 3 ...

  2. boost::units模块实现测试显式和隐式单位转换

    boost::units模块实现测试显式和隐式单位转换 实现功能 C++实现代码 实现功能 boost::units模块实现测试显式和隐式单位转换 C++实现代码 #include <iostr ...

  3. Mysql 死锁过程及案例详解之显式与隐式锁Explicit Table Lock Implicit Table Lock

    显式锁Explicit Table Lock与隐式锁Explicit Table Lock 显式锁Explicit Table Lock 显式表锁(Explicit Table Locks)即通过命令 ...

  4. mysql 隐式锁和显示锁_锁的类型以及粒度,两段锁协议,隐式和显示锁

    锁的粒度 行级锁 表级锁 应尽量只锁定需要修改的那部分数据,而不是所有资源.锁定的数据量越少,发生锁争用的可能性就越小,并发行就越高. 加锁需要消耗资源,锁的各种操作都会增加系统开销.因此锁的粒度越小 ...

  5. C#中数据类型转换-隐式转换

    隐式转换:一般是低类型向高类型转化,能够保证值不发生变化. 隐式数值转换: 从 sbyte 到 short.int.long.float.double 或 decimal. 从 byte 到 shor ...

  6. javascript笔记整理(数据类型强制/隐式转换 )

    A.数据类型强制转换 1.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 var a=false;alert(Number(a)); ...

  7. ahjesus自定义隐式转换和显示转换

    implicit    关键字用于声明隐式的用户定义类型转换运算符. 如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换. 参考戳此 explicit    ...

  8. 隐式转换、IF判断、逻辑【与、或、非】、三目运算的用法(基础)

    1.0 隐式转换 隐式转换 => 隐式的转换数据类型 => js机制(原理),不是语法.判断 => 语法     隐式转换什么时候发生? 操作符对操作数的类型是有要求的,如果操作数的 ...

  9. C#父类强制转换成子类,子类隐式转换成父类

    看你将父类引用到的是父类对象还是子类对象了. 比如Person类是Student的父类 那么可以将p直接强制转换为Student: Person p=new Student(); Student s= ...

最新文章

  1. 量子计算机混战:新贵离子 vs 老派超导体
  2. 消息 35371-聚集列存储索引
  3. 求高光谱图像相关系数矩阵
  4. usb管控软件_记账软件新外设:PUPUPULA 智能存钱罐登陆众筹
  5. cp文件服务器,docker容器与物理机的文件传输—docker cp命令
  6. 三个子系统_「正点原子Linux连载」第五十八章Linux INPUT子系统实验(一)
  7. Cracer8-模块和正则表达式
  8. angualr Material Icons
  9. 二叉排序树查找不成功的平均查找长度
  10. __attribute__((weak)):弱引用,可以不实现
  11. CocoaChina2013开发者大会演讲稿-主会场-陈昊芝
  12. Oracle中shrink space命令详解
  13. 自定义数组名做参数(传指针教学)
  14. 学习Linux的七点忠告
  15. matlab生猪的出售时机,数学模型程序代码-Matlab-姜启源-第三章-简单的优化模型.doc...
  16. Android创建快捷方式-SHORTCUT
  17. python中import re_彻底搞懂Python 中的 import 与 from import
  18. 域名泛解析,二级域名转向问题- -完美解决
  19. PDF写出:使用fop输出为pdf格式文件的Demo
  20. 什么是决策树?(详解)

热门文章

  1. python运行慢-提高python运行速度的几个技巧
  2. python编程入门电子书下载-Python编程基础如何快速入门?“附电子书下载”
  3. python与excel结合-python3与Excel的完美结合
  4. libevent中的时间及相关的管理
  5. 网络编程学习笔记(recvmsg和sendmsg函数)
  6. 题目1132:与7无关的数
  7. 题目1033:继续xxx定律
  8. [Android] for ArcFace Demo
  9. 玲珑杯 1157 - 造物主的戒律 主席树+离散化
  10. win8.1配置java环境个人 win8.1