mysql的mtr是指什么_MySQL中MTR的概念

MTR全称是Mini-Transaction,顾名思义,可以理解为"最小的事务",MySQL中把对底层页面的一次原子访问的过程称之为一个Mini-Transaction,这里的原子操作,指的是要么全部成功,要么全部失败,不存在中间状态。

MTR主要是被用在写undo log和redo log的场景下的。例如,我们要向一个B+树索引中插入一条记录,此时要么插入成功,要么插入失败,这个过程就可以称为一个MTR过程,这个过程中会产生一组redo log日志,这组日志在做MySQL的崩溃恢复的时候,是一个不可分割的整体。

假如我们有一个事务,事务中包含3条语句,那么MTR的概念图如下:

1ecf1cc4843bdb323531872efed851ef.png

Mini-Transaction一般遵循三条原则:

1、the fix rules

2、WAL

3、force-log-at-commit

这里我们解释下这三条原则:

1、the fix rules

解释第一条规则之前,我们有必要了解下MySQL中的latch的概念,在MySQL中,latch是一种轻量级的锁,与lock不同,它锁定的时间特别短,在innodb中,latch又可以分为mutex(互斥量)和rwlock(读写锁)2种,它的目的在于保证并发线程操作临界资源的正确性。

理解了latch的概念,我们看看the fix rule规则:

修改一个数据页,需要获得这个数据页的x-latch;

访问一个页是需要获得s-latch或者x-latch;

持有该页的latch直到修改或者访问该页的操作完成才释放

2、WAL

WAL技术想必大家比较熟悉,它是Innodb存储引擎之所以支持崩溃恢复的根本,也就是持久化一个数据页之前,需要将内存中响应的日志页先持久化

3、force-log-at-commit

这条原则比较重要,它是指在事务提交的时候,其产生的所有MTR日志都要刷到持久化设备中,从而保证崩溃恢复的逻辑。

之所以介绍MTR,是为了后续介绍MySQL8.0的redo log 优化做准备,在MySQL5.7中,mtr保证了事务内部操作的原子性。当用户进行操作的时候,会更新数据页,同时写redo log,mtr是redo log的载体,存在每个连接会话的私有变量中。当mtr提交时,会将本地redo log拷贝到全局的log_buffer中,为了保证redo log的有序性,需要加锁来访问log_buffer,这把锁就是上面提到的mutex,在这个锁保护下,除了要将本地日志拷贝到全局buffer,还需要将数据页加入了flush_list,供后台线程刷脏,辅助数据库检查点持续往前推进,所以这个锁在旧版本的MySQL中竞争非常激烈。MySQL8.0将这个问题进行了优化,后面的文章中将着重分析。

时间原因,先到这里吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端:Element UI 多选框组用法笔记

今天给大家分享一下Element UI 多选框组用法笔记&#xff0c;直接上代码&#xff01;<html><head></head><body><el-form> <el-form-item label"兴趣爱好:"> <el-checkbox-group v-model"form.checkList"> <…

xiaocms 关于搜索功能 添加搜索字段

自己折磨了好几天 就是没研究个出像样的的东西 看了一下 core/controller/index.php searchAction()方法 但是不知从何下手。查了sql语句&#xff0c;还是没实现 请教了一位自学php的小弟 &#xff0c;人家三下五除二的功夫就做出来了 解决的思路是一样的&#xff0c;可我就是…

python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python

Python编程真的那么容易吗&#xff1f;仅仅是看理论就可以学以致用吗&#xff1f;今天我给你介绍的这本书&#xff0c;也许会让你开始改变这种想法&#xff0c;因为这本书上的练习和案例以及指导本身就足够学好Python了。清华编程教授强力推荐《Python编程》&#xff0c;指导你…

微信终于可以发送大文件了!

来源丨扩展迷EXTFANS&#xff08;ID&#xff1a;infinitydaily&#xff09;https://mp.weixin.qq.com/s/EAwYnq7435oMQnz6JqkHYg微信作为一款国民级的通讯软件&#xff0c;虽然用户基数庞大&#xff0c;但在用户体验方面一直饱受诟病&#xff0c;尤其是在部分功能方面&#xff…

Iterable 超级接口

这是一个老祖宗,一代一代往下拨 collection 的方法如下,是一个跟接口方法如下,见API collection : add():添加一个元素     addAll():添加一组元素 clear();清空     remove(Object o) &#xff1a;移除     removeAll():移除一组元素     isEmpty();判断集合…

pc寄存器or程序计数器

一&#xff1a;PC寄存器解释 二&#xff1a;PC寄存器的作用

项目设计基础:处理过程设计相关知识介绍​

处理过程设计关键是用一种适当的表示形式来描述每个模块执行过程。常用的表示形式有图形、语言、表格。比如传统的框图、判定表等。1、程序流程图&#xff08;Program Flow Chart&#xff09;程序流程图也成为程序框图&#xff0c;是最早、流行最广泛的一种图形表示方法。程序流…

git冲突“accept theirs”和“accept yours”

Accept Yours 就是直接选取本地的代码&#xff0c;覆盖掉远程仓库的 Accept Theirs 是直接选取远程仓库的&#xff0c;覆盖掉自己本地的 我们选择Merge,自己手动行进选择、修改。 这里左边部分是你本地仓库的代码&#xff0c;右边部分是远程仓库的代码&#xff0c;中间的res…

系统实施基础:系统实施的相关知识介绍

1、系统实施的目的系统实施属于新系统开发工作的最后一个阶段&#xff0c;属于交付系统给客户的最后阶段。2、系统实施的任务硬件准备&#xff1a;按照总体设计方案准备服务器、配置网络系统。主要包括计算机主机/云服务器、输入输出设备、存储设备、通信设备等。软件准备&…

线程同步以及yield()、wait()、Notify()、Notifyall()

一、线程同步 1、线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏。2、线程同步方法是通过锁来实现&#xff0c;每个对象都有切仅有一个锁&#xff0c;这个锁与一个特定的对象关联&#xff0c;线程一旦获取了对象锁&#xff0c;其他访问该对象的线程就无法再访问该…

面试:整理面试中常被问到的8种数据结构

数据结构是一种特殊的组织和存储数据的方式&#xff0c;可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。几乎所有已开发的程序或软件系统都使用数据结构。此外&#xff0c;数据结构属于计算机科学和软件工程的基础。当…

系统测试相关知识笔记

1、系统测试的意义系统测试是为了发现系统中的错误而执行程序的过程&#xff0c;发现系统中存在的问题&#xff0c;及时处理掉&#xff0c;从而规避项目后续阶段顺利推进的风险、和高质量的软件交付给客户。2、系统测试的目的希望以最少的人力和时间发现潜在的各种错误和缺陷。…

最小生成树练习1(克鲁斯卡尔算法Kruskal)

今天刷一下水题练手入门&#xff0c;明天继续。 poj1861 Network&#xff08;最小生成树&#xff09;新手入门题。 题意&#xff1a;输出连接方案中最长的单根网线长度&#xff08;必须使这个值是所有方案中最小的&#xff09;&#xff0c;然后输出方案。 题解&#xff1a;本题…

系统测试:单元测试相关知识笔记

一、单元测试概念单元测试也成为模块测试&#xff0c;在模块编写完成且无编译错误后就可以进行。单元测试侧重模块中的内部处理逻辑和数据结构。如果采用机器测试&#xff0c;一般用白盒测试法。二、单元测试检查模块特征1、模块接口模块接口保证了测试模块数据流可以正确地流入…

跨网段远程调试vs_如何提高后台服务应用问题的排查效率?日志 VS 远程调试

转眼间&#xff0c;距离Jerry最近一篇文章推送已经过去了一个多月的时间了。公众号更新的频率降低&#xff0c;不是因为Jerry偷懒&#xff0c;而是由于从春节过后&#xff0c;我所在的SAP成都研究院数字创新空间整个团队&#xff0c;一直在忙一个5月份需要交付的项目上。Jerry每…

计算机硬件知识:BIOS、EFI与UEFI详解!

本文估计很多小白看不懂&#xff0c;但是还是建议你硬着头皮看完&#xff0c;这篇文章主要讲解了这几种“BIOS”的启动方式&#xff0c;对电脑启动问题判断的理解会有益处。BIOS是个程序&#xff0c;存储在BIOS芯片中&#xff0c;而现在的新式电脑用的基本都是UEFI启动&#xf…

在db2数据库上模拟死锁场景 还是z上的

如果条件允许&#xff0c;起两个线程互相抢资源就行了&#xff0c;但问题是&#xff0c;时间上还需要同步&#xff0c;要做到完美控制&#xff0c;还得加其他逻辑&#xff0c;忒费事&#xff0c;所以可以用下面的办法&#xff1a; 在目标表上直接加个锁……简单&#xff0c;粗暴…