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

    1.进程和线程 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种资源和状态信息,包括打开的文件.子进程和信号 ...

  2. 第一个WCF程序

    WCF的服务需要寄宿在进程中,我们把服务端的叫做宿主,为服务指定宿主指定的过程叫服务寄宿.有两种方式一种是自我寄宿(Self-Hosting),一种是IIS寄宿方式.Self-Hosting我们通过一 ...

  3. 利用cygwin创建windows下的crontab定时任务

    要求 必备知识 熟悉基本编程环境搭建. 运行环境 windows 7(64位); Cygwin-1.7.35 下载地址 环境下载 什么是Cygwin Cygwin是一个在windows平台上运行的类U ...

  4. 让 markdown 生成带目录的 html 文件

    安装 npm install -g i5ting_toc 用法 进入 markdown 文件所在的文件夹 举个栗子: 你的sample.md文件放在桌面上 cd /Users/dora/Desktop ...

  5. 词云-wordcloud

    import jiebabook = "2015.txt"txt = open(book).read()ex = {'不是','就是','的话','1.1','docin','ww ...

  6. 如何判断JavaScript数据具体类型

    昨晚做了阿里的题目,让我写一个函数,可以判断数据的具体类型.其实题目很简单的...但是真的是自己不太注意吧,写的很糟糕啊. 然后今天就自己写了一个,然后又到晚上搜了下,看看别人的写法,结果发现自己有点 ...

  7. Java中异常发生时代码执行流程

    异常与错误: 异常: 在Java中程序的错误主要是语法错误和语义错误,一个程序在编译和运行时出现的错误我们统一称之为异常,它是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员) ...

  8. 我的Visual Studio必用工具

    自己备用 代码生成工具:Resharper 代码颜色:supercharger 高亮单词 Word highlight with margin Productivity Power Tools 详细介 ...

  9. MVC应用程序显示上传的图片(续)

    上一篇<MVC应用程序显示上传的图片>http://www.cnblogs.com/insus/p/3597543.html 最后有提及没有实现用户点击图片,显示原图的功能.此篇Insus ...

  10. Oracle中如何写存储过程

    >存储过程是什么? 存储过程是一种命名的PL/SQL程序块,输入.输出参数数量[0个或多个],通常没有返回值[也有特殊的情况]. 运行SQL语句时,Oracle是要先编译再执行的:而存储过程是已 ...