mtr (mini-transaction)微事务

mtr作用

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

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

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

mtr何时使用

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

如fseg_alloc_free_page_general 申请页

对表空间加锁

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

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

  1. xdes_set_state(ret_descr, XDES_FSEG, mtr);
  2. mlog_write_ull(ret_descr + XDES_ID, seg_id, mtr);
  3. flst_add_last(seg_inode + FSEG_FREE,
  4. 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

  1. mtr_s_lock(dict_index_get_lock(index), &mtr);

 page lock

获取页 buf_page_get_gen

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

 redo log

  1. trx_undo_page_report_insert //先以redo log方式写入undo log
  2. 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,参见以下注释

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

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

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

  1. #define OS_FILE_LOG_BLOCK_SIZE 4096

数据库可以正常使用

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

2 代码优化

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

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

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

  1. element_size = sizeof(mtr_memo_slot_t);
  2. block = dyn_array_get_first_block(memo);
  3. while (block != NULL)
  4. {
  5. offset = dyn_block_get_used(block);
  6. while (offset != 0) {
  7. offset -= element_size;
  8. slot = static_cast<mtr_memo_slot_t*>((void*)(block->data + offset));
  9. mtr_memo_slot_release(mtr, slot);
  10. }
  11. ut_ad(offset == 0);
  12. block = dyn_array_get_next_block(memo, block);
  13. }

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

  1. mtr_memo_contains (debug)
  2. mtr_memo_pop_all
  3. mtr_memo_note_modifications
  4. 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. [Python学习笔记-006] 使用stomp.py校验JMS selector的正确性

    了解Jenkins的人都知道,JMS selector是基于SQL92语法实现的,本文将介绍使用stomp.py和ActiveMQ来校验JMS selector的正确性. Q: 什么是stomp.py ...

  2. picker(级联)组件及组件封装经验

    组件封装的几个经验 a.参数:最佳方式,仅一个object参数,所需要的实际参数,作为对象属性传入. 如此,便于数据的处理和扩展.例如,后期扩展需要增加参数,或者调整参数时,如果使用的对象传入,老的调 ...

  3. JVM学习记录-线程安全与锁优化(二)

    前言 高效并发是程序员们写代码时一直所追求的,HotSpot虚拟机开发团队也为此付出了很多努力,为了在线程之间更高效地共享数据,以及解决竞争问题,HotSpot开发团队做出了各种锁的优化技术常见的有: ...

  4. 使用Amazon AWS SNS 发送 SMS 消息 .net

    1.浏览aws 开发人员指南 https://docs.aws.amazon.com/zh_cn/sns/latest/dg/sms_publish-to-phone.html 2.安装 aws sm ...

  5. Redis 缓存设计原则

    基本原则 只应将热数据放到缓存中 所有缓存信息都应设置过期时间 缓存过期时间应当分散以避免集中过期 缓存key应具备可读性 应避免不同业务出现同名缓存key 可对key进行适当的缩写以节省内存空间 选 ...

  6. 深入理解.NET MemoryCache

    摘要 MemoryCache是.Net Framework 4.0开始提供的内存缓存类,使用该类型可以方便的在程序内部缓存数据并对于数据的有效性进行方便的管理,借助该类型可以实现ASP.NET中常用的 ...

  7. 使用spring security 2.0 和extjs 3.0实现web登录

    使用spring security 2.0 和extjs 3.0实现web登录 1开发环境说明 本例使用MyEclipse 6.5作为开发工具,jdk1.5作为编译工具,tomcat6.0作为web运 ...

  8. CAS实现的单点登录系统

    单点登录(single sign on ),简称SSO. 纯属学习用,对来自网络的部分如果侵害了您的权力,请联系我.QQ:262800095 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访 ...

  9. Redis——非阻塞IO和队列

    Redis是个高并发的中间件,但是确实是单线程.而且,Nginx.Node.js等也是单线程的.Redis通过非阻塞IO(IO多路复用)处理那么多的并发客户端连接,并且,由于Redis所有的数据都在内 ...

  10. 一千行 MySQL 学习笔记

    Windows服务 -- 启动MySQL    net start mysql-- 创建Windows服务    sc create mysql binPath= mysqld_bin_path(注意 ...