两阶段提交-mysql

二阶段提交的 prepare 阶段,InnoDB 主要做五件事。

第 1 件,把分配给事务的所有 undo 段的状态从 TRX_UNDO_ACTIVE 修改为 TRX_UNDO_PREPARED

进入二阶段提交的事务,都至少改变过(插入、更新、删除)一个用户表的一条记录,最少会分配 1 个 undo 段,最多会分配 4 个 undo 段。

具体什么情况分配多少个 undo 段,后续关于 undo 模块的文章会有详细介绍。

不管 InnoDB 给事务分配了几个 undo 段,它们的状态都会被修改为 TRX_UNDO_PREPARED。

第 2 件,把事务 Xid 写入所有 undo 段中当前提交事务的 undo 日志组头信息。

InnoDB 给当前提交事务分配的每个 undo 段中,都会有一组 undo 日志属于这个事务,事务 Xid 就写入 undo 日志组的头信息。

对于第 1、2 件事,如果事务改变了用户普通表的数据,修改 undo 段状态、把事务 Xid 写入 undo 日志组头信息,都会产生 redo 日志。

第 3 件,把内存中的事务对象状态从 TRX_STATE_ACTIVE 修改为 TRX_STATE_PREPARED

前面修改 undo 状态,是为了事务提交完成之前,MySQL 崩溃了,下次启动时,能够从 undo 段中恢复崩溃之前的事务状态。

这里修改事务对象状态,用于 MySQL 正常运行过程中,标识事务已经进入二阶段提交的 prepare 阶段。

第 4 件,如果当前提交事务的隔离级别是读未提交READ-UNCOMMITTED)或读已提交READ-COMMITTED),InnoDB 会释放事务给记录加的共享、排他 GAP 锁。

虽然读未提交、读已提交隔离级别一般都只加普通记录锁,不加 GAP 锁,但是,外键约束检查、插入记录重复值检查这两个场景下,还是会给相应的记录加 GAP 锁。

第 5 件,调用 trx_flush_logs(),处理 redo 日志刷盘的相关逻辑。

static void trx_flush_logs(trx_t *trx, lsn_t lsn) {...switch (thd_requested_durability(trx->mysql_thd)) {case HA_IGNORE_DURABILITY:/* We set the HA_IGNORE_DURABILITYduring prepare phase of binlog group committo not flush redo log for every transaction here. So that we can flush prepared recordsof transactions to redo log in a groupright before writing them to binary logduring flush stage of binlog group commit. */break;case HA_REGULAR_DURABILITY:...trx_flush_log_if_needed(lsn, trx);}
}

从名字上看,trx_flush_logs() 的作用是把事务产生的 redo 日志刷盘。

MYSQL_BIN_LOG::prepare() 调用 ha_prepare_low() 之前,就已经把当前事务所属用户线程对象的 durability_property 属性设置为 HA_IGNORE_DURABILITY 了。

用户线程对象的 durability_property 属性值为 HA_IGNORE_DURABILITY,prepare 阶段并不会把 redo 日志刷盘。

二阶段提交的 commit 阶段,分为三个子阶段。

flush 子阶段,要干两件事:

第 1 件,触发操作系统把 prepare 阶段及之前产生的 redo 日志刷盘。

事务执行过程中,改变(插入、更新、删除)表中数据产生的 redo 日志、prepare 阶段修改 undo 段状态产生的 redo 日志,都会由后台线程先写入 page cache,再由操作系统把 page cache 中的 redo 日志刷盘。

等待操作系统把 page cache 中的 redo 日志刷盘,这个时间存在不确定性,InnoDB 会在需要时主动触发操作系统马上把 page cache 中的 redo 日志刷盘。

上一篇文章,我们介绍过,二阶段提交的 prepare 阶段不会主动触发操作系统把 page cache 中的 redo 日志刷盘。这个刷盘操作会留到 flush 子阶段进行。

第 2 件,把事务执行过程中产生的 binlog 日志写入 binlog 日志文件。

这个写入操作,也是先写入 page cache,至于操作系统什么时候把 page cache 中的 binlog 日志刷盘,flush 子阶段就不管了。

sync 子阶段,根据系统变量 sync_binlog 的值决定是否要触发操作系统马上把 page cache 中的 binlog 日志刷盘。

commit 子阶段,完成 InnoDB 的事务提交。

3. 组提交

flush 子阶段会触发 redo 日志刷盘,sync 子阶段可能会触发 binlog 日志刷盘,都涉及到磁盘 IO。

TP 场景,比较常见的情况是事务只改变(插入、更新、删除)表中少量数据,产生的 redo 日志、binlog 日志也比较少。

我们把这种事务称为小事务

以 redo 日志为例,一个事务产生的 redo 日志少,操作系统的一个页就有可能存放多个事务产生的 redo 日志。

如果每个事务提交时都把自己产生的 redo 日志刷盘,共享操作系统同一个页存放 redo 日志的多个事务,就会触发操作系统把这个页多次刷盘。

数据库闲的时候,把操作系统的同一个页多次刷盘,也没啥问题,反正磁盘闲着也是闲着。

数据库忙的时候,假设某个时间点有 1 万个小事务要提交,每 10 个小事务共享操作系统的一个页用于存放 redo 日志,总共需要操作系统的 1000 个页。

1 万个事务各自提交,就要触发操作系统把这 1000 个数据页刷盘 10000 次。

根据上面假设的这个场景,我们可以看到,这些事务都在某个时间点提交,可以等到共享操作系统同一个页的事务把 redo 日志都写入到 page cache 之后,再触发操作系统把 page cache 的这一个页刷盘。

这样一来,1000 个数据页,只刷盘 1000 次就可以了,刷盘次数只有原来的十分之一,效率大大的提高了。

上面是以 redo 日志为例描述操作系统的同一个页重复刷盘的问题,binlog 日志也有同样的问题。

某个时间点提交的多个事务触发操作系统的同一个页重复刷盘,这是个问题,为了解决这个问题,InnoDB 引入了组提交

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

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

相关文章

工艺品wordpress外贸主题

工艺品wordpress外贸主题 简约大气的wordpress外贸主题,适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377

社交媒体市场:揭示Facebook的商业模式

在数字化时代,社交媒体已经成为人们生活中不可或缺的一部分。Facebook作为全球最大的社交媒体平台之一,其商业模式的运作方式对于了解社交媒体市场的发展趋势和影响力至关重要。本文将深入探讨Facebook的商业模式,剖析其运作机制,…

【Java面试题系列】基础篇

目录 基本常识标识符的命名规则八种基本数据类型的大小,以及他们的封装类3*0.10.3返回值是什么short s1 1; s1 s1 1;有什么错? short s1 1; s1 1;有什么错?简述&&与&的区别?简述break与continue、return的区别?Arrays类的…

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址: 05-Rab…

项目:USB键盘和鼠标的复合设备

我们的复合设备使用一个物理设备就可以完成多个功能。 使用复合设备同时完成USB键盘和鼠标功能,它的主要实现方式有两种, 第一个就是我们将多个设备描述符合并成一个,这个相对比较简单,我们只要根据相应的报告描述符处理数据就可…

vue3的ref和reactive对比

一,ref 作用: 定义一个 ref 响应式的数据语法: const xxx ref(initValue) 用法 创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。 JS中操作数据: xxx.value 模板中读取数据: 不需要.value&#xff0…

Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题

关键计算地方: 1.当前是上滑动还是下滑动(相对于屏幕) ,使用ev.getRawY()获得当前滑动位置在屏幕哪个地方 2. 计算文本客滑动到哪里即可停止, (行高*总文本行数)- (行高 * 最多显示行数) int sum getLineHeight() * getLineCount() - getLineHeight() * getMaxLines(); …

Red Hat配置本地yum源

Red Hat配置本地yum源 创建本地源文件夹 mkdir -p /mnt/cdrom挂载镜像文件至指定的目录 mount /dev/cdrom /mnt/cdrom备份本地源 cp -rf /etc/yum.repos.d /etc/yum.repos.d_$(date %Y%m%d_%H%M%S)删除默认原本地源 rm -rf /etc/yum.repos.d/*配置本地源,创建…

分享一个Python爬虫入门实例(有源码,学习使用)

一、爬虫基础知识 Python爬虫是一种使用Python编程语言实现的自动化获取网页数据的技术。它广泛应用于数据采集、数据分析、网络监测等领域。以下是对Python爬虫的详细介绍: 架构和组成:下载器:负责根据指定的URL下载网页内容,常用的库有Requests和urllib。解析器:用于解…

一文涵盖所有工作中遇到的redis操作,让你从此学会redis

一文涵盖所有工作中遇到的redis操作,让你从此学会redis 本文会从基础篇到进阶篇,逐步来讲解redis和springboot的整合,如何去操作,以及他的作用。让你学会使用redis,爱上使用redis。 介绍redis 首先我们来介绍一下re…

如何在Linux系统运行RStudio Server并实现无公网IP远程访问【内网穿透】

文章目录 推荐 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

c++的学习之路:7、类和对象(3)

一、初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式,如下方代码就是初始化列表的方式。从图片可以看出这种方式也可以利用缺省初始化…

vue项目双击from表单限制重复提交 添加全局注册自定义函数

第一步: 找到utils文件夹添加directive.js文件 import Vue from vue //全局防抖函数 // 在vue上挂载一个指量 preventReClick const preventReClick Vue.directive(preventReClick, {inserted: function (el, binding) {console.log(el.disabled)el.addEventListener(click,…

rs485自动收发电路

R/RO:receive/receive out,接收,连接单片机的 rx D/DI:drive/drive in,驱动,连接单片机的 tx 自动控制电路的目的就是在 tx 空闲(空闲为高并)时拉低 RE 和 DE,工作&…

【Python】【Flask】提交表单后报500错误

【背景】 日常用户使用的一个Online的基于Flask做的工具,今天忽然报错,看现象是点击表单提交按钮后发生错误。报500内部错误。 【分析】 用print步步为营接近root cause。 报错对应视图函数的展示部分正常执行。提交表单按钮后的内容全部没有正常执行。 提交表单用的方法是…

设计模式(15):迭代器模式

介绍 提供一中可以遍历聚合对象的方式。又称为: 游标cursor模式 迭代器模式角色 抽象聚合类(Aggregate):提供了聚合相关的方法,并提供获取迭代器的方法;具体集合类(ConcreteAggregate):实现了抽象聚合类;抽象迭代器(Iterator):…

紫光展锐P7885核心板详细参数介绍_5G安卓智能模块开发方案

紫光展锐P7885核心板采用了先进的6nm EUV制程工艺,集成了高性能的应用处理器和金融级安全解决方案,为用户带来了全新的性能体验。 P7885核心板搭载了先进的6nm制程工艺SoC P7885,其中包含四核A76和四核A55,主频可达2.7Ghz&#xf…

每天五分钟计算机视觉:使用神经网络完成人脸的特征点检测

本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…

Laya1.8.4 UI长按选择对应位置释放技能

需求: 需要实现拖拽摇杆选择技能释放位置,释放技能。 原理:首先拆分需求,分为两部分,UI部分和场景部分,UI部分需要实现长按效果,长按后又要有拖动效果,将官方文档的示例代码改了改…

k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd

k8s笔记28--快速在ubuntu上基于二进制和源码安装containerd 介绍containerd 安装方法二进制文件安装源码构建安装 注意事项说明 介绍 Containerd是一个工业标准的容器运行时,它强调简单、健壮和可移植性。它可作为Linux和Windows的守护进程,能管理主机系…