MySQL的内部XA的二阶段提交

news2024/11/16 12:30:39

内部XA

可能大家一听感觉很陌生,什么是XA?XA是一种分布式事务管理规范,MySQL内部有一个XA事务管理器来支持分布式事务,可能这么一听更懵了,那么我这么解释一下,MySQL是支持主从的,主从分布在不同的机器,也就是 说MySQL也是分布式的。不同的MySQL节点之前靠什么同步?靠binlog。但是单个MySQL服务靠什么支持事务的?靠redo-log和undo-log。其实XA就是为了解决redo-log和bin-log数据不同步的问题

日志的相关概念

我们简单说一下redo-log和bin-log的相关概念,undo-log上一篇文章介绍过

redo-log

又称重放日志,主要用于保持数据一致性和完整性,因为当我们修改一条记录的时候,不可能把整个page都刷到磁盘再返给客户端,我们知道,一个page默认是16kb,如果改了一个字符而和磁盘刷新16KB是不明智的,那么怎么办?MySQL将这个操作影响的数据存入一个日志中去,只需要一个简单的记录,比如test表的位移100改为a,,然后刷入磁盘(log buffer满了也会刷入磁盘)即可。

bin-log

binlog 是 binary log 的缩写,即 二进制日志 。 binlog 中记载了数据库发生的变化,比方说新建了一个数据库或者表、表结构发生改变、表中的数据发生了变化时都会记录相应的binlog日志。主要用于MySQL节点间的数据同步和恢复。

在这里插入图片描述

抛出问题

前面我们说了,内部XA是为了解决redo-log和bin-log数据不同步的问题,那么会出现哪种问题呢?那么我问一句,redo-log 和bin-log 应该哪个先crash?
如果先crash redo-log 会发生什么问题?比如我们执行了一个insert操作,然后主节点a服务器crash redo-log之后服务宕机了,还没来得及写入bin-log,服务器恢复之后,由于其他机器没有insert的bin-log导致a服务器和其他服务器数据不一致
如果先crash bin-log 我们执行了一个insert操作,主节点a服务器crash bin-log后服务宕机,服务恢复之后,其他节点根据bin-log执行了insert,但是服务a并没有redo-log,不会恢复数据,同样导致数据不一致。

二阶段提交

那么怎么才能保证redo-log和bin-log的一致呢?最简单的方式,等redo-log和bin-log都写入才算执行成功不就行了。说的很好,但是肯定不能两个同时写入,而是要先写一个再写另外一个,这里MySQL就用到了两阶段提交来解决这个问题
我们来举一个例子,执行一个sql upate table1 set name ='张三' where id=1,那么这是一个怎么样的执行流程呢,大概流程如下:

  1. 在内存中查找id=1的记录,没有的话从磁盘中读取到内存中,并返回记录
  2. 记录undo-log
  3. 更新记录
  4. 开启第一阶段提交,进入prepare阶段,生成xid,写入redo-log,并标记为prepare
    在这里插入图片描述
  5. 写入bin-log
  6. 提交事务,进入第二阶段提交,处于commit状态

注:下图是截取自其他博文的流程图
在这里插入图片描述

数据恢复

当服务宕机重启后,MySQL怎么实现数据恢复的呢,我们看下面的情况

  • redo-log 为空或者全部commit ,这个时候与binlog是一致的
  • redo-log 为prepare的情况下MySQL在恢复数据的时候会在redo-log中找到全局唯一的XID,然后拿着XID去bin-log里面查看有没有同步过去,如果同步过去了,就把redo-log的状态改为commit并提交,如果没有找到则说明bin-log没有写入成功,放弃提交

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

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

相关文章

导入失败,报错:“too many filtered rows xxx, “ErrorURL“:“

一、问题: 注:前面能正常写入,突然就报错,导入失败,报错:“too many filtered rows xxx, "ErrorURL":" {"TxnId":769494,"Label":"datax_doris_writer_bf176078-…

预处理/预编译详解(C/C++)

在上一篇的bolg中的编译与链接中提到过预处理,但只是较为简单的讲解,本篇将会对预处理进行详细的讲解。 其中在预处理中很重要的一个一个知识点是#define定义常量与宏,还区分了宏与函数的区别,以及#和##符号,还涉及条件…

【Java SE】类和对象详解

文章目录 1.什么是面向对象2. 类的定义和使用2.1 简单认识类2.2 类的定义格式 3. 类的实例化3.1 什么是实例化3.1.1 练习(定义一学生类) 3.2 类和对象的说明 4. this 引用5. 构造方法6. 对象的初始化6.1 默认初始化6.2 就地初始化 7. 封装7.1 封装的概念…

Angular系列教程之单向绑定与双向绑定

文章目录 介绍单向绑定双向绑定在自定义组件中实现双向绑定属性总结 介绍 在Angular开发中,数据的绑定是非常重要的概念。它允许我们将应用程序的数据与用户界面进行交互,实现数据的动态更新。在本文中,我们将探讨Angular中的两种数据绑定方…

学习k8s的应用(三)

一、k8s部署ngnix 1、一些查看命令 1-1、所有命令空间 kubectl get pod --all-namespaces kubectl get svc --all-namespaces1-2、指定命令空间 kubectl get pod -n yabin kubectl get svc -n yabin2、单节点集群兼容 # 因为目前只有一个master节点,默认安装后…

workflow源码解析:ThreadTask

1、使用程序&#xff0c;一个简单的加法运算程序 #include <iostream> #include <workflow/WFTaskFactory.h> #include <errno.h>// 直接定义thread_task三要素 // 一个典型的后端程序由三个部分组成&#xff0c;并且完全独立开发。即&#xff1a;程序协议算…

解决C语言wprintf函数无法打印中文的问题

在Visual Studio中&#xff0c;wchar_t[]字符数组用来存储UTF-16编码的字符串&#xff0c;但C语言库函数wprintf无法打印含有汉字的wchar_t字符串。 解决办法是用WriteConsoleW函数重新实现一个自己的my_wprintf函数。 #include <stdio.h> #include <Windows.h>//…

PDF文件中字体乱码的一种简单的处理方法

要解决问题先得碰到问题&#xff0c;碰到问题就迈出了解决问题的关键一步。 问题PDF文件的下载链接 这文件用Acrobat打开&#xff0c;无法搜索文本&#xff0c;复制文本出来也都是乱码。但用sumatra PDF打开就不存在这个问题&#xff01; 用Acrobat的印前检查解决。prefligh…

Python网络爬虫进阶:自动切换HTTP代理IP的应用

前言 当你决定做一个网络爬虫的时候&#xff0c;就意味着你要面对一个很大的挑战——IP池和中间件。这两个东西听起来很大上&#xff0c;但其实就是为了让你的爬虫不被封杀了。下面我就来给你讲讲如何搞定这些东西。 第一步&#xff1a;创建爬虫IP池的详细过程 首先&#xf…

电商数据分析--常见的数据采集工具及方法

数据采集|数据运营和数据分析 走进数据&#xff0c;一起学习数据处理&#xff0c;数据分析&#xff0c;数据挖掘&#xff0c;一起成长&#xff0c;相信通过一起努力&#xff0c;未来2-3年我们都会成为公司的中流砥柱。懂数据&#xff0c;会分析&#xff0c;会挖掘&#xff0c;…

mathtype2024版本下载与安装(mac版本也包含在内)

安装包补丁主要是mathtype的安装包&#xff0c;与它的补丁。 详细安装过程&#xff1a; step1&#xff1a; 使用方法是下载完成后先安装MathType-win-zh.exe文件&#xff0c;跟着步骤走直接安装就行。 step2&#xff1a; 关闭之后&#xff0c;以管理员身份运行MathType7PJ.exe…

【linux】visudo

碎碎念 visudo命令是用来修改一个叫做 /etc/sudoers 的文件的&#xff0c;用来设置哪些 用户 和 组 可以使用sudo命令。并且使用visudo而不是使用 vi /etc/sudoers 的原因在于&#xff1a;visudo自带了检查功能&#xff0c;可以判断是否存在语法问题&#xff0c;所以更加安全 …

单节点部署 Gpmall 商城系统

目录 实验中使用的技术 实验过程 实验中使用的技术 Java Redis Elasticsearch&#xff08;先不用&#xff09; Nginx MariaDB ZooKeeper Kafka 实验过程 1.Xnode1克隆虚拟机gpmall CRT连接&#xff08;root密码&#xff1a;000000&#xff09; 2修改主机名 [root…

纵行科技参加“十四五”国家重点研发计划课题“工业化建造自动识别与数据采集(AIDC)成套技术”工程试点

近期&#xff0c;“十四五”国家重点研发计划NQI课题组“产学研用”联合团队开展的“工业化建造自动识别与数据采集&#xff08;AIDC&#xff09;成套技术”工程建造场景集成应用试点&#xff08;第一阶段&#xff09;&#xff0c;在广州白云国际机场T3航站楼项目西指廊及北港湾…

uniapp使用安装sass

1.首先你要安装node-sass npm install node-sass --save-dev2.安装sass-loader npm install sass-loader --save-dev3.修改style标签&#xff0c;声明使用sass <style lang"scss" scoped>

AI工具(20240116):Copilot Pro,Fitten Code等

Copilot Pro Copilot Pro是微软推出的Copilot的付费增强版本,通过提供优先访问GPT-4等最新AI模型,大大提升用户的创造力和工作效率。该服务可与Microsoft 365订阅捆绑使用,支持在Word、Excel等Office应用内直接使用Copilot功能,帮助用户更快速地起草文档、电子邮件和演示文稿等…

【CV】使用 matplotlib 画统计图,并用 OpenCV 显示静图和动图

1. 效果 静图 动图 2.思路 准备数据使用 pyplot 画统计图图片写入流&#xff0c;流转图&#xff08;numpy&#xff09;matplotlib 颜色 RGB 转 OpenCV 颜色 BRG 4. 静图 代码过程有注释&#xff0c;很简单的实现。注意 matplotlib RGB 转 OpenCV BGR image image[:, :,…

刘知远LLM入门到实战——自然语言基础

文章目录 自然语言处理基础词表示语言模型N-gram ModelNeural Language Model: 为什么NLP等领域的模型越来越大&#xff1f; 大模型会带来哪些新的范式和挑战&#xff1f; 自然语言处理基础 让计算机理解人类语言&#xff0c;图灵测试就是基于对话的方式。 研究历史&#xff…

shell简单截取curl GET返回的body消息体

目录 需求背景&#xff1a; 示例&#xff1a; 解决方式&#xff1a; 需求背景&#xff1a; 用shell解析 curl命令GET到的消息体&#xff0c;获取body消息体里的某个字段的值,只是个简单的示例&#xff0c;可以在此基础上更改满足自己的需求 示例&#xff1a; curl一个API…

pytorch一致数据增强—独用增强

前作 [1] 介绍了一种用 pytorch 模仿 MONAI 实现多幅图&#xff08;如&#xff1a;image 与 label&#xff09;同用 random seed 保证一致变换的写法&#xff0c;核心是 MultiCompose 类和 to_multi 包装函数。不过 [1] 没考虑各图用不同 augmentation 的情况&#xff0c;如&am…