redo,binlog的两阶段提交

回顾流程

执行更新语句

UPDATE t_user SET name = 'xiaolin' WHERE id = 1;
  1. 执行器负责具体执行,会调用存储引擎的接口,通过主键索引树搜索获取 id = 1 这一行记录:
    1. 如果 id=1 这一行所在的数据页本来就在 buffer pool 中,就直接返回给执行器更新;
    2. 如果记录不在 buffer pool,将数据页从磁盘读入到 buffer pool,返回记录给执行器。
  2. 执行器得到聚簇索引记录后,会看一下更新前的记录和更新后的记录是否一样:
    • 如果一样的话就不进行后续更新流程;
    • 如果不一样的话就把更新前的记录和更新后的记录都当作参数传给 InnoDB 层,让 InnoDB 真正的执行更新记录的操作;
  3. 开启事务, InnoDB 层更新记录前,首先要记录相应的 undo log,因为这是更新操作,需要把被更新的列的旧值记下来,也就是要生成一条 undo log,undo log 会写入 Buffer Pool 中的 Undo 页面,不过在内存修改该 Undo 页面后,需要记录对应的 redo log。
  4. InnoDB 层开始更新记录,会先更新内存(同时标记为脏页),然后将记录写到 redo log 里面,这个时候更新就算完成了。为了减少磁盘I/O,不会立即将脏页写入磁盘,后续由后台线程选择一个合适的时机将脏页写入到磁盘。这就是 WAL 技术,MySQL 的写操作并不是立刻写到磁盘上,而是先写 redo 日志,然后在合适的时间再将修改的行数据写到磁盘上。
  5. 至此,一条记录更新完了。
  6. 在一条更新语句执行完成后,然后开始记录该语句对应的 binlog,此时记录的 binlog 会被保存到 binlog cache,并没有刷新到硬盘上的 binlog 文件,在事务提交时才会统一将该事务运行过程中的所有 binlog 刷新到硬盘。
  7. 事务提交,剩下的就是「两阶段提交」的事情了。

为什么需要两阶段提交

 如果在持久化 redo log 和 binlog 两个日志的过程中,出现了半成功状态,那么就有两种情况

  • 如果在将 redo log 刷入到磁盘之后, MySQL 突然宕机了,而 binlog 还没有来得及写入。MySQL 重启后,通过 redo log 能将 Buffer Pool 中 id = 1 这行数据的 name 字段恢复到新值 xiaolin,但是 binlog 里面没有记录这条更新语句,在主从架构中,binlog 会被复制到从库,由于 binlog 丢失了这条更新语句,从库的这一行 name 字段是旧值 jay,与主库的值不一致性;
  • 如果在将 binlog 刷入到磁盘之后, MySQL 突然宕机了,而 redo log 还没有来得及写入。由于 redo log 还没写,崩溃恢复以后这个事务无效,所以 id = 1 这行数据的 name 字段还是旧值 jay,而 binlog 里面记录了这条更新语句,在主从架构中,binlog 会被复制到从库,从库执行了这条更新语句,那么这一行 name 字段是新值 xiaolin,与主库的值不一致性;

可以看到,在持久化 redo log 和 binlog 这两份日志的时候,如果出现半成功的状态,就会造成主从环境的数据不一致性。这是因为 redo log 影响主库的数据,binlog 影响从库的数据,所以 redo log 和 binlog 必须保持一致才能保证主从数据一致。

两阶段提交的过程

内部 XA 事务:内部 XA 事务由 binlog 作为协调者,存储引擎是参与者。

当客户端执行 commit 语句或者在自动提交的情况下,MySQL 内部开启一个 XA 事务,分两阶段来完成 XA 事务的提交,如下图:

  • prepare 阶段:将 XID(内部 XA 事务的 ID) 写入到 redo log,同时将 redo log 对应的事务状态设置为 prepare,然后将 redo log 持久化到磁盘(innodb_flush_log_at_trx_commit = 1 的作用);

  • commit 阶段:把 XID 写入到 binlog,然后将 binlog 持久化到磁盘(sync_binlog = 1 的作用),接着调用引擎的提交事务接口,将 redo log 状态设置为 commit,此时该状态并不需要持久化到磁盘,只需要 write 到文件系统的 page cache 中就够了,因为只要 binlog 写磁盘成功,就算 redo log 的状态还是 prepare 也没有关系,一样会被认为事务已经执行成功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络技术】【Kali Linux】Wireshark嗅探(七)超文本传送协议(HTTP)

一、实验目的 本次实验使用Wireshark流量分析工具进行网络嗅探,旨在了解超文本传送协议(HTTP)的工作原理。 二、HTTP协议概述 超文本传送协议( H yper T ext T ransfer P rotocol, HTTP)是互联网应用层的一个重要协…

Prometheus实战篇:Prometheus监控mongodb

Prometheus实战篇:Prometheus监控mongodb 准备环境 docker-compose安装mongodb docker-compose.yaml version: 3 services:mongo:image: mongo:4.2.5container_name: mongorestart: alwaysvolumes:- /data/mongo/db: /data/dbport:- 27017:27017command: [--auth]enviromen…

索引、映射、文档

一个索引就是一个拥有几分相似特征的文档的集合,索引必须全部是小写字母的。 映射是定义一个文档和它所包含的字段如何被存储和索引的过程。 文档就是索引中存储的一条条数据。 通俗来理解就是:索引就是数据库中的表,而映射就是定义表时的…

IDEA 常用快捷键大全(建议收藏)

代码开发时 常用快捷键 快捷键功能使用建议CtrlAltOOptimize imports 比较实用 去除导入的无用的包CtrlAltIAuto-indent line(s) 比较实用 自动缩进代码CtrlAltLReformat code 比较实用 格式化选中的代码CtrlAltShiftL 比较实用 格式化整个文件TabIndent 比较实用 缩进Sh…

QT qss文件设置样式

方式一 (单个) 方式二 (全局) 所有按钮都会采用这个样式。 方式三 (qss文件) 创建资源文件 创建qss文件(Button.qss) 引用qss文件 QApplication a(argc, argv);QString qss;QFile…

智汇云舟受邀出席《城市轨道交通公共安全防范安全评价标准》专家评审会

1月3日,由中国城市公共交通协会归口的《城市轨道交通公共安全防范安全评价标准》(以下简称“《标准》”)送审稿审查会顺利召开。该标准由同方威视技术股份有限公司、上海新海信通信息技术有限公司和中安保实业集团有限公司主编,北…

程序设计与计算机系统 第3、4章

一、 生成汇编文件 .s :gcc -O1 -S code.c 生成机器码文件 .o :gcc -O1 -c code.c 生成可执行文件 : gcc -O1 -o code.c main.c 反汇编: objdump -d code.o 同一段代码。单个文件生成的.o文件的反汇编码和链接后可执行程序的反汇编码一致&…

Python 面向对象之元类

Python 面向对象之元类 【一】一切皆对象 【1】元类 元类(metaclass)是Python中用于创建类的类。在Python中,类是对象,而元类就是类的类它们控制类的创建过程,允许你定制类的行为Python中内置的默认元类是type我们用…

如果需求不完整或模糊,如何进行功能点估算?

在项目早期进行功能点估算,经常会遇到需求不完整或模糊的情况。这让人无法准确理解用户需求,这会增加项目本身的风险,对功能点估算也造成影响,可能会影响到项目的规模和工作量。因此在遇到此种情况,一般可以采取如下措…

linux线程重启

以下是获取线程id和重启指定线程的示例代码&#xff1a; #include <stdio.h> #include <pthread.h>// 线程函数&#xff0c;用来打印线程ID void *print_thread_id(void *arg) {printf("Thread ID: %lu\n", pthread_self());return NULL; }int main() {…

【VRTK】【Unity】【VR开发】Linear Drives

课程配套学习项目源码资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 前面一篇讨论了角度运动机制,本篇讨论线性运动机制。和角度运动机制类似,线性运动机制提供了更为仿真的互动机制。也分为基于物理的和不基于…

TCP三次握手过程?

TCP三次握手过程&#xff1f; 分享 回答 1 浏览 3662 一颗小胡椒 2 CISM-WSE CISP-PTS 三次握手是 TCP 连接的建立过程。在握手之前&#xff0c;主动打开连接的客户端结束 CLOSE 阶段&#xff0c;被动打开的服务器也结束 CLOSE 阶段&#xff0c;并进入 LISTEN 阶段。随后进入…

大创项目推荐 深度学习图像风格迁移

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

代码训练营Day.28 | 93. 复原IP地址、78. 子集、90. 子集II

93. 复原IP地址 1. LeetCode链接 . - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 3. 解法 字符串切四刀&#xff0c;最后一刀必须是在末位。 麻烦的地方在于文本的各种限制条件、剪枝等等。 class Solution { public:vector<string> results;string result…

java基础 - 01 java集合框架概述以及Iterable接口和Collection简单介绍

最近在开发过程中&#xff0c;发现自己对java集合的了解已经忘得差不多了&#xff0c;作为开发者&#xff0c;这可不是一件好事哈&#xff0c;之前开始学习java基础的时候&#xff0c;学过一段时间的java集合&#xff0c;但是现在到了工作岗位上的时候&#xff0c;发现自己用到…

K8S部署GitLab

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【数据结构】二叉树链式结构详解

目录 1.前言2.快速创建一颗二叉树3.二叉树的遍历3.1前序遍历3.2中序遍历3.3后序遍历3.4层序遍历 4.二叉树节点个数与高度4.1二叉树节点个数4.2二叉树叶子节点个数4.3二叉树高度4.4二叉树第k层节点个数4.5二叉树查找值为x的节点 5.二叉树的基础oj题练习6.二叉树的创建和销毁6.1通…

【⭐AI工具⭐】AI工具导航推荐

目录 零 工具导航&#x1f449;【[AI工具集导航](https://ai-bot.cn/)】&#x1f448;&#x1f449;【[iForAI](https://iforai.com/)】&#x1f448;&#x1f449;【[AInav](https://www.ainav.cn/)】&#x1f448;&#x1f449;【[Navi AI 导航](https://www.naviai.cn/)】&a…

PhpPythonC++圆类的实现(OOP)

哎......被投诉了 &#x1f62d;&#x1f62d;&#x1f62d;&#x1f62d;&#x1f62d; 其实也不是小编不更&#xff0c;这不是期末了吗&#xff08;zhaojiekou~~&#xff09;&#xff0c;而且最近学的信息收集和ctf感觉好像没找到啥能更的&#xff08;不过最经还是在考虑更一…

Flink CDC使用

Flink 环境准备 Flink 版本对应的CDC版本 两个jar包上传到flink bin目录下 flink-sql-connector-mysql-cdc mysql-connector-java 重启Flink集群