mtr (mini-transaction)微事务

mtr作用

mtr模块主要保证物理操作的一致性和原子性

1 一致性:通过读写锁来保证

2 原子性:涉及到的物理更新,都记入redo日志

mtr何时使用

1 文件管理:innodb表空间以segment,extent,page的方式管理,segment,extent,page的申请释放,都会修改对应的控制信息。

如fseg_alloc_free_page_general 申请页

对表空间加锁

latch = fil_space_get_latch(space, &flags);
mtr_x_lock(latch, mtr);

 fseg_alloc_free_page_low->fseg_alloc_free_page_low 写控制信息并记入redo, 部分代码如下

xdes_set_state(ret_descr, XDES_FSEG, mtr);
mlog_write_ull(ret_descr + XDES_ID, seg_id, mtr);
flst_add_last(seg_inode + FSEG_FREE,
ret_descr + XDES_FLST_NODE, mtr);

2 B树操作:(b树包括索引和insert buffer)

这里的读写锁有两种:btree lock,page lock

btree lock 为了防止B树分裂(不确定,还有些疑问?)

例如: 向聚集索引插入一行记录,row_ins_clust_index_entry_low

btree lock

mtr_s_lock(dict_index_get_lock(index), &mtr);

 page lock

获取页 buf_page_get_gen

......
rw_lock_x_lock_inline(&(block->lock), 0, file, line);
......
mtr_memo_push(mtr, block, fix_type);

 redo log

trx_undo_page_report_insert  //先以redo log方式写入undo log
page_cur_insert_rec_write_log//写redo log

mtr中的锁

锁均为读写锁,原子操作完成后立即释放(mtr_commit),不需要事务结束时释放

遵守两阶段加锁协议,不会死锁。

mtr中redo log

mtr过程中的redo log会存入自己的动态数组mtr->log中,mtr_commit时将mtr->log刷入 redo log buffer中。

一些思考

1 redo log buffer的 block的大小为512,参见以下注释

/** The next value should be smaller or equal to the smallest sector size used
on any disk. A log block is required to be a portion of disk which is written
so that if the start and the end of a block get written to disk, then the
whole block gets written. This should be true even in most cases of a crash:
if this fails for a log block, then it is equivalent to a media failure in the
log. */ #define OS_FILE_LOG_BLOCK_SIZE 512

 512 为普通磁盘的扇区大小,对于SSD来说扇区大小为4K

OS_FILE_LOG_BLOCK_SIZE 应设置为可调节参数,对SSD可以设为4096。如果不考虑binlog,可以一定程度上提升写redo的速度,加快commit。
  经测试改为

#define OS_FILE_LOG_BLOCK_SIZE     4096

数据库可以正常使用

注:以上测试数据库需正常关闭,然后删除log file文件

2 代码优化

mtr_memo_pop_all 中有如下代码,这是一个O(n2)的查找遍历

offset = dyn_array_get_data_size(memo);
while (offset > 0) {
offset -= sizeof(mtr_memo_slot_t);
slot = static_cast<mtr_memo_slot_t*>(dyn_array_get_element(memo, offset));
mtr_memo_slot_release(mtr, slot);
}
其中dyn_array_get_element是一个遍历查找元素的过程。  

改进后,是一个O(n)的遍历

element_size = sizeof(mtr_memo_slot_t);
block = dyn_array_get_first_block(memo);
while (block != NULL)
{
offset = dyn_block_get_used(block);
while (offset != 0) {
offset -= element_size;
slot = static_cast<mtr_memo_slot_t*>((void*)(block->data + offset));
mtr_memo_slot_release(mtr, slot);
}
ut_ad(offset == 0);
block = dyn_array_get_next_block(memo, block);
}

 类似的代码出现在以下函数中

mtr_memo_contains (debug)
mtr_memo_pop_all
mtr_memo_note_modifications
mtr_memo_release

  ps:以上分析基于5.6.10,最近看5.6.16这块已优化。

关于innodb mtr模块的更多相关文章

  1. 1009MySQL数据库InnoDB存储引擎Log漫游

    00 – Undo Log Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atom ...

  2. MySQL · 引擎特性 · InnoDB 同步机制

    前言 现代操作系统以及硬件基本都支持并发程序,而在并发程序设计中,各个进程或者线程需要对公共变量的访问加以制约,此外,不同的进程或者线程需要协同工作以完成特征的任务,这就需要一套完善的同步机制,在Li ...

  3. [转载]强烈推荐学习的blog

    膜拜大牛 原文出处:http://hedengcheng.com/?p=676 ACM Queue (Architecting Tomorrow’s Computing) 网址:http://queu ...

  4. 流量录制回放工具jvm-sandbox-repeater入门篇——服务部署

    趋于当前技术不断更新.产品功能多元化之下,流量回放的热度也是越来越高. 在前一段时间,测试团队也提到阿里开源的流量回放工具 jvm-sandbox-repeater 我个人就先尝试一下,期间还是遇到一 ...

  5. MySQL InnoDB 日志管理机制中的MTR和日志刷盘

    1.MTR(mini-transaction) 在MySQL的 InnoDB日志管理机制中,有一个很重要的概念就是MTR.MTR是InnoDB存储擎中一个很重要的用来保证物理写的完整性和持久性的机制. ...

  6. 【转载】MySQL5.6.27 Release Note解读(innodb及复制模块)

    新功能   问题描述(Bug #18871046, Bug #72811): 主要为了解决一个比较“古老”的MySQL在NUMA架构下的“swap insanity”问题,其表现为尽管为InnoDB ...

  7. zabbix 线路质量监控自定义python模块,集成ICMP/TCP/UDP探测,批量监控线路质量自定义阈值联动mtr保存线路故障日志并发送至noc邮箱

    互联网故障一般表现为丢包和时延增大,持续性故障不难排查,难的是间歇性或凌晨故障,后者往往来不及等我们测试就已经恢复正常,得不到异常时的mtr无法判断故障点在哪里 故此有了根据丢包率和时延变换联动mtr ...

  8. MySQL · 引擎特性 · InnoDB Buffer Pool

    前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入 ...

  9. [小结]InnoDB体系结构及工作原理

    参阅:<innodb存储引擎内幕>原创文章,会不定时更新,转发请标明出处:http://www.cnblogs.com/janehoo/p/7717041.html 一.概述: innod ...

随机推荐

  1. mysql关于timestamp字段相关内容

    发现5.6和5.7版本的创建表不一致,从5.6导出数据表创建sql文件,然后导入到5.7表会报错,timestamp不能为空 查看的sql_mode mysql5.0以上支持的三种模式 1. ANSI ...

  2. maven - 使用nexus 搭建maven私服

    1, java环境 [wenbronk@localhost nexus]$ java -version java version "1.8.0_121" Java(TM) SE R ...

  3. poi导出联动下拉选择的excel

    最近碰到一个功能, 觉得可以记录下来. 在web中, 经常会碰到上下级的数据, 或者是联动数据, 比如省市联动. 那么在导入数据的时候, 是否可以在动态生成的模板中, 加入联动限制呢. 一. 数据准备 ...

  4. 浅析Session和Cookie

    Cookie   Cookie的作用,就是当一个用户通过http访问一个服务器时,这个服务器会将一些key/value键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户访问该 ...

  5. SpringMVC之类型转换

    在数据绑定上,SpringMVC提供了到各种基本类型的转换,由前端到后台时,SpringMVC将字符串参数自动转换为各种基本类型.而对于其他,则需要自己编写代码进行转换.本随笔以转换时间类型为例,使用 ...

  6. 如何优雅的控制goroutine的数量

    1,为什么要控制goroutine的数量? goroutine固然好,但是数量太多了,往往会带来很多麻烦,比如耗尽系统资源导致程序崩溃,或者CPU使用率过高导致系统忙不过来.比如: ; i < ...

  7. UVa 442 Matrix Chain Multiplication(栈的应用)

    题目链接: https://cn.vjudge.net/problem/UVA-442 /* 问题 输入有括号表示优先级的矩阵链乘式子,计算该式进行的乘法次数之和 解题思路 栈的应用,直接忽视左括号, ...

  8. UIView动画上

    主要参考:http://blog.csdn.net/huifeidexin_1/article/details/7597868  http://www.2cto.com/kf/201409/33566 ...

  9. Docker基础-端口映射与容器互联

    1.端口映射实现访问容器 1.从外部访问容器应用 在启动容器的时候,如果不指定对应的参数,在容器外部是无法通过网络来访问容器内部的网络应用和服务的. 当容器中运行一些网络应用,要让外部访问这些应用时, ...

  10. Maven为不同环境配置打包

    在开发过程中经常要遇到为不同的环境打包,这里面最主要的问题在于,不同环境的配置是不一样的,如果为不同环境打包每次都手工修改配置,那不但工作量大,而且很容易出错.如果用ant的话,用变量加上replac ...