Mysql的分布式(XA)真面目

Mysql-XA

  • 一、XA是什么?
  • 二、MySQL中XA实现
    • 1.内部XA事务
        • 两阶段提交PC
    • 2.外部XA事务
  • 总结

一、XA是什么?

XA 协议本就是为一个分布式事务协议,它规定了 XA PREPARE、XA COMMIT、XA ROLLBACK 等命令。XA 协议规定了事务管理器(协调者)和资源管理器(数据节点)如何交互,共同完成分布式 2PC 的过程
在这里插入图片描述
XA主要规定了RM与TM之间的交互,下面来看下XA规范中定义的RM 和 TM交互的接口:
在这里插入图片描述

  • xa_start负责开启或者恢复一个事务分支,并且管理XID到调用线程

  • xa_end 负责取消当前线程与事务分支的关联

  • xa_prepare负责询问RM 是否准备好了提交事务分支

  • xa_commit通知RM提交事务分支

  • xa_rollback 通知RM回滚事务分支

XA协议是使用了二阶段协议的,其中:

第一阶段TM要求所有的RM准备提交对应的事务分支,询问RM是否有能力保证成功的提交事务分支,RM根据自己的情况,如果判断自己进行的工作可以被提交,那就就对工作内容进行持久化,并给TM回执OK;否者给TM的回执NO。RM在发送了否定答复并回滚了已经的工作后,就可以丢弃这个事务分支信息了。

第二阶段TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare回执NO的话,则TM通知所有RM回滚自己的事务分支。

也就是TM与RM之间是通过两阶段提交协议进行交互的。

二、MySQL中XA实现

1.内部XA事务

MySQL中只有InnoDB引擎支持XA协议,内部XA事务主要用来协调存储引擎和二进制日志
在这里插入图片描述
确认下mysql是否启动了xa功能:
在这里插入图片描述
测试手动执行xa事务:
在这里插入图片描述
其中首先使用XA START ‘xid’ 启动了一个XA事务,并把它置于ACTIVE状态

对于一个ACTIVE状态的 XA事务,我们可以执行构成事务的多条SQL语句,也就是指定分支事务的边界,然后执行一个XA END ‘xid’语句,XA END把事务放入IDLE状态,也就是结束事务边界,在xa start和xa end之间的语句就构成了本分支事务的一个事务范围。当调用xa end 'xid1’后由于结束了事务边界,所以这时候如果在执行sql语句会抛出ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the IDLE state错误,也就是当分支事务处于IDLE状态时候不允许执行没有包含到分支事务边界里面的其他sql.

对于一个IDLE 状态XA事务,可以执行一个XA PREPARE语句或一个XA COMMIT…ONE PHASE语句,其中XA PREPARE把事务放入PREPARED状态。在此点上的XA RECOVER语句将在其输出中包括事务的xid值,因为XA RECOVER会列出处于PREPARED状态的所有XA事务。XA COMMIT…ONE PHASE用于预备和提交事务,也就是转换为一阶段协议,直接提交事务。

对于一个PREPARED状态的 XA事务,可以执行XA COMMIT 语句来提交或者执行XA ROLLBACK来回滚xa事务。

其中二阶段协议中第一阶段是执行 xa prepare时候,这时候MySQL客户端(TM)向MySQL数据库服务器(RM)发出prepare"准备提交"请求,数据库收到请求后执行数据修改和日志记录等处理,处理完成后只是把事务的状态改成"可以提交",然后把结果返回给事务管理器。

如果第一阶段中数据库都prepare成功,那么mysql客户端(TM)向数据库服务器发出"commit"请求,数据库服务器把事务的"可以提交"状态改为"提交完成"状态,然后返回应答。如果在第一阶段内数据库的操作发生了错误,或者mysql客户端(RM)收不到数据库的回应,则认为事务失败,执行rollback回撤所有数据库的事务。

两阶段提交PC

在这里插入图片描述
mysql的两阶段提交原理

(1) perpare阶段 写入redo日志
1、设置undo state=TRX_UNDO_PREPARED;
2、刷事务更新产生的redo日志;
(2) commit阶段 写入binlog日志
1、将事务产生的binlog写入文件,刷入磁盘;
2、设置undo页的状态,置为TRX_UNDO_TO_FREE或TRX_UNDO_TO_PURGE; //标记可以清理回滚段
3、记录事务对应的binlog偏移,写入系统表空间。
两阶段提交是跨系统维持数据逻辑一致性时常用的一个方案。两阶段存在阻塞难题,提出的三阶段提交,在二阶段的基础上增加了一个预提交。
(3)假设法验证为什么分两阶段:
A. 先写 redo log 后写 binlog。假设在 redo log 写完,binlog 还没有写完的时候,MySQL 进程异常重启。由于我们前面说过的,redo log 写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行 c 的值是 1。
但是由于 binlog 没写完就 crash 了,这时候 binlog 里面就没有记录这个语句。因此,之后备份日志的时候,存起来的 binlog 里面就没有这条语句。
然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 c 的值就是 0,与原库的值不同。
B. 先写 binlog 后写 redo log。如果在 binlog 写完之后 crash,由于 redo log 还没写,崩溃恢复以后这个事务无效,所以这一行 c 的值是 0。但是 binlog 里面已经记录了“把c 从 0 改成 1”这个日志。所以,在之后用 binlog 来恢复的时候就多了一个事务出来,恢复出来的这一行 c 的值就是 1,与原库的值不同。
(4)redo和binlog这两种日志有以下三点不同。
1、 redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
2、 redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
3、redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

2.外部XA事务

参与到外部分布式事务中(比如多个数据库实现的分布式事务),目前mysql对外部事务的支持还不够,这里也就不进行太多的描述了。

总结

以上就是这次对mysqlXA的理解和总结,主要参照mysql官方文档资料并加入自己的实践和理解,贴一下mysql官方文档地址,希望大家多多支持和关注。

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

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

相关文章

华为鸿蒙系统界面首次曝光,华为鸿蒙系统长这样,界面首次曝光,网友:谷歌内心很慌!...

华为鸿蒙系统长这样,界面首次曝光,网友:谷歌内心很慌! 最近关于华为的消息非常多,尤其是华为自己的系统——鸿蒙系统。相信很多人都在关注这个系统的研究进度,毕竟这个系统是我们国家的首例,如果…

关于面向对象的真面目

关于面向对象的真面目 面向对象是软件开发的综合技术 我们先从一个简单的问题开始介绍。 “为什么要基于面向对象来开发软件?” 不管谁问这样的问题,笔者都会这样回答: “为了轻松地开发软件。” 可能有的人听到“轻松”二字会感觉很意…

李彦宏简介

李彦宏简介 李彦宏,1991年毕业于北京大学信息管理专业,随后赴美国布法罗纽约州立大学完成计算机科学硕士学位。在美国的8年间,李彦宏先生先后担任了道琼斯公司高级顾问,《华尔街日报》网络版实时金融信息系统设计者,以…

李彦宏回应百度落后:我们擅长技术含量高的

2019年人工智能系统学: https://edu.csdn.net/topic/ai30?utm_sourcecsdn_bw BAT中,谁是老大不好说,但是论争议性,百度确实相对较多。 一方面,“百度搜索引擎已死”的说法愈演愈烈; 另一方面&#xff0c…

李彦宏们牛在哪里?中国十大CEO简历

NO.1 李彦宏 百度公司总裁 简历: 李彦宏,1991年毕业于北京大学信息管理专业,随后赴美国布法罗纽约州立大学完成计算机科学硕士学位。在美国的8年间,李彦宏先生先后担任了道?琼斯公司高级顾问,《华尔街日报》…

李彦宏如何拯救百度?

作者 | 何加盐 本文经授权转载自何加盐(ID:ihejiayan) 他智商超群,曾经是高考状元,北大才子,留美精英。 他阳光帅气,被誉为中国互联网企业家里面,最好看的美男子。 但他也身负无数骂…

致李彦宏的公开信:百度真的乏善可陈

致李彦宏的公开信:百度真的乏善可陈 曹政 | 企业信息化 | 出处:原创-IT| 2012年06月04日 10:40 | 阅读 576 次 文/DoNews专栏作家 曹政 拜读了网上关于李彦宏在百度联盟峰会的演讲实录,对其中若干观点实在不敢苟同,如鲠在喉。特发…

又是别人家的公司!李彦宏给创新员工发超 2000 万奖金……

2022年9月7日,2022百度秋日嘉年华暨百度最高奖颁奖典礼,在百度科技园顺利成功举行。百度创始人、董事长兼首席执行官李彦宏,为“大道”、“潮汐”、“拨云”三支团队分别颁发最高奖,奖金折合人民币超2000万元。 (截图自…

人物-李彦宏:李彦宏

ylbtech-人物-李彦宏:李彦宏 百度 创始人、董事长兼首席执行官 李彦宏,男,汉族, 无党派人士,1968年11月出生, 山西阳泉人,百度创始人、董事长兼首席执行官,全面负责百度的 战略规划和…

图表控件TeeChart干货分享(绘制2D、3D实时曲线---VC++示例源代码--网络首发)

最近接手了一个项目,其中涉及到MFC和实时曲线显示的问题,由于我之前从未接触过此类技术,现学现搞,把其间用到的觉得对初学者有用的东西,总结一下。 尤其是关于TeeChart控件部分,网上资料零碎,且…

winform上的统计图——新手向

今天看见一篇适合新手理解和使用WinForm Chart控件的文章 目录 图标的要素 一、图表实现 图表标题 图例 XY坐标轴 数据 二、代码实现 转载 图标的要素 这是一张普通的柱状统计图,包括了: 图表标题图例XY轴标题数据 一般在上位机中有这些要素…

老鼠屎地理信息可视化第三弹:Plotly+Pyecharts绘制地理坐标系线图

由于最近老鼠屎做的东西和地图上的线型图相关,因此在这里做一点简单总结。很多地方都调试得很不理想,希望成功的地方可以给大家带来一点点启发,不理想的地方也欢迎大神们赐教。 1 Plotly 1.1 地图上绘制线 有关pyplot的相关在老鼠屎的博文使…

Echarts 地理信息可视化:基于地图显示坐标点信息

Ecahrts 基于地理信息的可视化 Echarts 是一款基于js的交互式图表工具 这一模型可用于显示气候、地理、人流等各种信息。 1、环境 在线调试echarts的功能可以在官网,选择实例下任意一个点开: 然后在左侧的编辑框中即可编辑(其中包含了自动渲染脚本&…

数据可视化图表-散点图(Scatter plot)

本文是接着这篇内容的:https://blog.csdn.net/Cassiel60/article/details/88350442 散点图是用于研究两个变量之间关系的经典的和基本的图表。 如果数据中有多个组,则可能需要以不同颜色可视化每个组。 在 matplotlib 中,您可以使用 plt.sca…

实战PyQt5: 155-QChart图表之极坐标图表

在前面的图表中,我们使用的坐标系都是直角坐标系(也称笛卡尔坐标系), 但是有些数据序列,使用极坐标系来显示更合理(比如常见的雷达图)。QChart中,提供QPolarChart来实现用极坐标系显示的图表。 QPolarChart QPolarChart在极坐标图中显示数据…

2022-04-22 工作记录--Highcharts-图表点击事件 + 图例点击事件 + 图例格式化后的回调

Highcharts-图表点击事件 图例点击事件 图例格式化后的回调 一、前言 看似很简单的问题,其实里面有很多细节,所以做个笔记哟~❀ 如下图:上面是图表,下面是图例哟☺️ 二、官方文档 https://www.highcharts.com.cn/docs 三、…

XCL-Charts图表库简要教程及常见问题

这个Andriod图表库项目从开始至现在,热情消耗几近殆尽。还好已基本实现我想做的那些东西。趁还剩下点兴趣,把一些点非常简单的归纳一下。 所支持的图表类型: 基类 图表名称 BarChart 横/竖向柱形图及背向式柱…

使用Google Chart API 创建实时图表

实时图表可以实时显示数据。这意味着数据将永久更新以始终显示当前图表。要创建实时图表,我们使用JavaScript和Google Chart API。 这些实时图表通常用于仪表板中,以显示例如温度或价格的变化情况。应用领域多样,它们看起来确实不错。你自己看…

利用ARCGIS实现图片与excel中坐标点的匹配并绘图

一、背景 本次的实验完成的是坐标点文件与图片的匹配,已有的数据分别是点的坐标excel文件以及区域图片,来实现区域的绘制。 二、步骤 1、首先将坐标点excel文件导入ARCGIS中进行展点,数据的格式如下: 2、点击ARCGIS界面中的文件…

chatgpt赋能Python-python_plot坐标轴

Python绘图库中坐标轴的设置 介绍 Python是一种简单易学,功能强大的编程语言。它被广泛用于数据科学和可视化领域。Python绘图库中的坐标轴设置可以让我们更好地展示数据,让我们更轻松地理解数据。本篇文章将介绍Python绘图库中坐标轴设置的方法和技巧…