mysql5.7 只读事务_Innodb read only事务、MySQL5.7和Percona的事务改进-阿里云开发者社区...

本文详细介绍了MySQL5.7和Percona在只读事务方面的优化,包括事务链表的分离、读视图创建的改进以及Percona对创建read view的优化。内容涉及事务开启、可见性判断、内存分配等方面的代码分析,旨在理解这些优化如何提升只读性能。
摘要由CSDN通过智能技术生成

前言

只读事务在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)判断事务是否是只读的;

trx->auto_commit = (trx->api_trx && trx->api_auto_commit)

|| thd_trx_is_auto_commit(trx->mysql_thd);

trx->read_only =

(trx->api_trx && !trx->read_write)

|| (!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值