December 22, 2013

Innodb read only事务、MySQL5.7和Percona的事务改进

前言 只读事务在MySQL5.6中引入,改进了创建视图快照的开销,减少了持有trx_sys->mutex的时间,这有利于提升只读性能;这一点已经广为人知;   本文的内容基本按照读代码的顺序来的,先了解了下Oracle MySQL5.6.15的只读事务部分代码,再看了Percona5.6对于事务部分的相关改进;随后大概过了下Oracle MySQL5.7对事务部分的优化;   总的来说,Percona移植了其在5.5上所做的优化,而Oracle MySQL5.7优化的更彻底,很多代码都重构了。   本文不涉及到性能测试,只是代码阅读过程的笔记,记录的目的是方便以后查阅方便,因此同时也附带上了一些新版本修改的Rev号。   1.如何使用只读事务   a.设置变量tx_read_only,当全局设置为true时,涉及到的SQL只能是只读的。这个参数可以是session 级别,也可以是全局级别; 开启该参数后,就默认所有查询走只读的逻辑;   b.开启事务时指明: START TRANSACTION READ ONLY;   c.autocommit状态下的查询操作也会被当做只读事务   如果事务中混合了DML操作,就会报如下错误: root@test 09:57:58>delete from t1; ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.  2.只读事务涉及的代码逻辑(MySQL5.6)   Innodb将所有的事务对象维护在链表上,通过trx_sys来管理,在5.6中,最明显的变化就是事务链表被拆分成了两个链表: 一个是只读事务链表:ro_trx_list,其他非标记为只读的事务对象放在链表rw_trx_list上;   这种分离,使得读写事务链表足够小,创建readview 的MVCC快照的速度更快;   a.开始一个事务 入口函数trx_start_low  1)判断事务是否是只读的;     […]