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. 使用Java客户端对Redis进行操作

    一.背景 上篇文章我们介绍了如何在centos7下面进行安装单机版redis以及redis集群.这篇文章,我们来聊一聊如何使用java客户端来进行操作redis.我们知道redis的java客户端有很 ...

  2. SwitchHosts—hosts管理工具

    SwitchHosts是一个管理.快速切换Hosts小工具,开源软件,一键切换Hosts配置,非常实用,高效.开发Web过程成,部署有多套环境,网址域名都相同,部署在不同的服务器上,有开发环境.测试环 ...

  3. java学习-http中get请求的非ascii参数如何编码解码探讨

    # 背景: 看着别人项目代码看到一个PathUtils工具类, 里面只有一个方法,String  rebuild(String Path),将路径进行URLDecoder.decode解码,避免路径中 ...

  4. canvas实现涂鸦板

    实现思路:监听鼠标按下.移动.松开事件,将鼠标按下的值赋值给moveTo的x和y值,作为起始位置.在移动事件中,将鼠标距离可视区x和y值赋给lineTo,再将路径闭合.以下是具体的代码 <!DO ...

  5. BackgroundWorker简单实用(简便的异步操作)

    微软提供了一个快捷使用多线程的帮助类BackgroundWorker,能够快速创建一个新的线程,并能报告进度,暂停,以及在线程完成后处理别的任务. 1.BackgroundWorker类介绍 1.1. ...

  6. SpringCloud入门之Maven系统安装及配置

    一.Maven 介绍 这个单词中文翻译为“专家”或“内行”.下面将向你介绍 Maven这一跨平台的项目管理工具.作为 Apache 组织中的一个成功的开源项目,Maven 主要服务于基 Java 平台 ...

  7. Jetty学习四:部署到Jetty

    转自:http://www.tuicool.com/articles/NrENjq Web应用的框架 标准Jetty发布版本能部署标准servlet Spec Web应用和Jetty内部Context ...

  8. mysql索引总结(4)-MySQL索引失效的几种情况

    mysql索引总结(1)-mysql 索引类型以及创建 mysql索引总结(2)-MySQL聚簇索引和非聚簇索引 mysql索引总结(3)-MySQL聚簇索引和非聚簇索引 mysql索引总结(4)-M ...

  9. 使用area标签模仿a标签

    众所周知,map标签可以给img图像标记热点区域,而area标签就是跟map标签一起使用的. 但area标签的作用可不止用来标记热点,因为它也有href属性,因此某些场景可以代替a标签进行页面跳转. ...

  10. Docker基础教程(安装篇)

    Linux安装: 1.yum -y install docker-io 2.service docker start 3.chkconfig docker on Window安装: Docker 引擎 ...