深入理解分布式事务⑨ ---->MySQL 事务的实现原理 之 MySQL 中的XA 事务(基本原理、流程分析、事务语法、简单例子演示)详解

目录

  • MySQL 事务的实现原理 之 MySQL 中的XA 事务(基本原理、流程分析、事务语法、简单例子演示)详解
    • MySQL 中的 XA 事务
      • 1、XA 事务的基本原理
        • 1-1:XA 事务模型图:
        • 1-2:XA 事务模型的两阶段提交操作:Prepare 准备阶段 和 Commit 提交阶段 流程图:
          • 1-2-1:在 PrePare 准备阶段:
          • 1-2-2:在 Commit 提交阶段:
      • 2、MySQL 的 XA 事务语法
        • 2-1:在 MySQL 命令行输入如下命令可以查看存储引擎是否支持 XA 事务
        • 2-2:MySQL XA 事务的基本语法如下所示:
        • 2-3:MySQL 官方文档中对于 XA 事务的一个简单示例:
        • 2-4:MySQL XA 事务 使用 xid 标识分布式事务,xid 主要由以下几部分组成:
        • 2-5:演示 XA 事务回滚
        • 简单说下:内部 XA 事务 和 外部 XA 事务

MySQL 事务的实现原理 之 MySQL 中的XA 事务(基本原理、流程分析、事务语法、简单例子演示)详解


MySQL 作为互联网行业使用最多的关系型数据库之一,其 InnoDB 存储引擎本身就支持事务。

MySQL 的事务实现离不开 Redo Log(重做日志) 和 Undo Log (回滚日志)。

从某种程度上说,事务的隔离性是由 锁 和 MVCC 机制实现的,原子性 和 持久性 是有 Redo Log 实现的,一致性是由 Undo Log 实现的。

Redo:重做、重复、恢复
Undo:撤销、取消

MySQL 事务的实现原理,涉及的内容大概有:

Redo Log :重做日志

Undo Log :回滚日志

BinLog:二进制日志文件

MySQL 事务的流程;

MySQL 中的 XA 事务。


MySQL 中的 XA 事务

MySQL 中的 XA 事务全称是 “eXtended Architecture Transaction”,即扩展架构事务。

MySQL 5.0.3 版本开始支持 XA 分布式事务,并且只有 InnoDB 存储引擎支持 XA 事务。


1、XA 事务的基本原理

XA 事务支持不同数据库之间实现分布式事务。

这里的不同数据库,可以是不同的 MySQL 实例,也可以是不同的数据库类型,比如 ,MySQL 数据库和 Oracle 数据库。

XA 事务本质上是一种 基于两阶段提交的分布式事务 ,分布式事务可以简单理解为多个数据库事务共同完成一个原子性的事务操作。参与操作的多个事务要么全部提交成功,要么全部提交失败。

在使用 XA 分布式事务时,InnoDB 存储引擎的事务隔离级别需要设置为 串行化

XA 事务由 一个事务管理器(Transaction Manager)一个或者多个资源管理器(Resource Manager)一个应用程序(Application Program) 组成,组成模型如图:


1-1:XA 事务模型图:

在这里插入图片描述

1、事务管理器:主要对参与全局事务的各个分支事务进行协调,并与资源管理器进行通信。

2、资源管理器:主要提供对事务资源的访问能力。实际上,一个数据库既可以看作一个资源管理器。

3、应用程序:主要用来明确全局事务和各个分支事务,指定全局事务中的各个操作。


1-2:XA 事务模型的两阶段提交操作:Prepare 准备阶段 和 Commit 提交阶段 流程图:

因为 XA 事务是基于两阶段提交的分布式事务,所以 XA 事务也被拆分为 Prepare 阶段 和 Commit 阶段。

在这里插入图片描述


1-2-1:在 PrePare 准备阶段:

1、事务管理器向资源管理器发送准备指令,

2、资源管理器接收到指令后,执行数据的修改操作并记录相关的日志信息,

3、然后向事务管理器返回可以提交或者不可以提交的结果信息。


1-2-2:在 Commit 提交阶段:

4、事务管理器接收所有资源管理器返回的结果信息。

5、如果某一个或多个资源管理器向事务管理器返回的结果信息为不可以提交,或者超时,则事务管理器向所有的资源管理发送回滚指令。

6、如果事务管理器接收到的所有资源管理器返回的结果信息为可以提交,则事务管理器向所有的资源管理器发送提交事务的命令。


2、MySQL 的 XA 事务语法


2-1:在 MySQL 命令行输入如下命令可以查看存储引擎是否支持 XA 事务
show engines \G
# 登录 mysql 服务器
e:
cd E:\install\mysql8\mysql-8.0.21-winx64\bin
mysql -u root -p
密码:123456# 使用这个test数据库
use test;show engines \G

在这里插入图片描述

从输出的结果信息来看,只有 InnoDB 存储引擎支持事务、XA 事务 和 事务保存点。


2-2:MySQL XA 事务的基本语法如下所示:

1、开启 XA 事务,如果使用的是 XA START 命令而不是 XA BEGIN 命令,则不支持 [ JOIN | RESUME ] ,xid 是一个唯一值,表示事务分支标识符,语法如下:

-- 1、开启 XA 事务,如果使用的是 XA start 命令而不是 XA begin 命令,则不支持 [JOIN|RESUME],
-- xid 是一个唯一值,表示事务分支标识符,语法如下:
XA {START|BEGIN} xid [JOIN|RESUME]-- 2、结束一个 XA 事务,不支持 [SUSPEND [FOR MIGRATE]] ,语法如下:
XA END xid [SUSPEND [FOR MIGRATE]]-- 3、准备提交 XA 事务
XA PREPARE xid-- 4、提交 XA 事务,如果使用了 one phase 命令,表示使用一阶段提交。
-- 在两阶段提交协议中,如果只有一个资源管理器参与操作,则可以优化为 一阶段提交。
XA COMMIT xid [ONE PHASE]-- 5、回滚 XA 事务
XA ROLLBACK xid-- 6、列出所有处于准备阶段的 XA 事务。
XA RECOVER [CONVERT XID]

15.3.8.1 XA Transaction SQL Statements

在这里插入图片描述


2-3:MySQL 官方文档中对于 XA 事务的一个简单示例:

演示 MySQL 作为全局事务中的一个事务分支,将一行记录插入一个表:

在这里插入图片描述


select * from account;# 开启一个 XA 事务
xa start 'ljh_xid';# 插入一条数据
insert into account (id,name,balance) values ('10','小白',1000);# 结束一个 XA 事务
xa end 'ljh_xid';# 准备提交 XA 事务
xa prepare 'ljh_xid';# 提交 XA 事务
xa commit 'ljh_xid';

15.3.8.2 XA Transaction States

在这里插入图片描述


2-4:MySQL XA 事务 使用 xid 标识分布式事务,xid 主要由以下几部分组成:
xid :  gtrid [ , bqual [ , formatID ] ]

gtrid:必须要有,为字符串,表示全局事务标识符。

bqual:可选,为字符串,默认是空串,表示分支限定符。

formatID:可选,默认值为 1 ,用于标识 gtrid 和 bqual 值使用的格式。


2-5:演示 XA 事务回滚

在这里插入图片描述


# 执行查询
select * from account;# 开启一个 XA 事务
xa start 'jjj_xid';# 插入一条数据
insert into account (id,name,balance) values ('20','小黄',2000);# 执行查询
select * from account;# 结果一个 XA 事务
xa end 'jjj_xid';# 列出所有处于准备阶段的 XA 事务
xa recover;# 准备提交 XA 事务,让 XA 事务处于准备阶段
xa prepare 'jjj_xid';# 列出所有处于准备阶段的 XA 事务
xa recover;# 执行查询
select * from account;# 回滚 XA 事务
xa rollback 'jjj_xid';# 执行查询
select * from account;# 提交 XA 事务
xa commit 'jjj_xid';

简单说下:内部 XA 事务 和 外部 XA 事务

在某种程度上, MySQL XA 事务可以分为 内部 XA 事务外部 XA 事务

外部 XA 事务 属于分布式事务的一种实现方式,而 内部 XA 事务 则表示 MySQL 使用了 InnoDB 作为存储引擎,并且开启了 BinLog ,为了保证 BinLog 与 Redo Log 的一致性,MySQL 内部使用了 XA 事务。







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

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

相关文章

Stable Diffusion webUI 最全且简单配置指南

Stable Diffusion webUI 配置指南 本博客主要介绍部署Stable Diffusion到本地,生成想要的风格图片。 文章目录 Stable Diffusion webUI 配置指南1、配置环境(1)pip环境[可选](2)conda环境[可选] 2、配置Stable Diffu…

Jenkins docker部署springboot项目

1、创建jenkins容器 1,首先,我们需要创建一个 Jenkins 数据卷,用于存储 Jenkins 的配置信息。可以通过以下命令创建一个数据卷: docker volume create jenkins_data启动 Jenkins 容器并挂载数据卷: docker run -dit…

Leetcode—422. 有效的单词方块【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—422. 有效的单词方块 实现代码 class Solution { public:bool validWordSquare(vector<string>& words) {int row words.size();for(int i 0; i < row; i) {// 当前这一行的列数int col words[i].length(…

Java高阶私房菜:JVM性能优化案例及讲解

目录 核心思想 优化思考方向 压测环境准备 堆大小配置调优 调优前 调优后 分析结论 垃圾收集器配置调优 调优前 调优后 分析结论 JVM性能优化是一项复杂且耗时的工作&#xff0c;该环节没办法一蹴而就&#xff0c;它需要耐心雕琢&#xff0c;逐步优化至理想状态。“…

驾校考试宝典vip一点通驾考精简500题科目一四速记口诀c1答题技巧

下载地址&#xff1a;驾校考试宝典vip一点通驾考精简500题科目一四速记口诀c1答题技巧.zip 这份速记口诀考点总结 评分标准 和答题技巧&#xff0c;很详细&#xff0c;全科目速记口诀秘笈.pdf

QT中的容器

Qt中的容器 关于Qt中的容器类&#xff0c;下面我们来进行一个总结&#xff1a; Qt的容器类比标准模板库&#xff08;STL&#xff09;中的容器类更轻巧、安全和易于使用。这些容器类是隐式共享和可重入的&#xff0c;而且他们进行了速度和存储的优化&#xff0c;因此可以减少可…

mysql 指定根目录 迁移根目录

mysql 指定根目录 迁移根目录 1、问题描述2、问题分析3、解决方法3.1、初始化mysql前就手动指定mysql根目录为一个大的分区(支持动态扩容)&#xff0c;事前就根本上解决mysql根目录空间不够问题3.1.0、方法思路3.1.1、卸载mariadb3.1.2、下载Mysql安装包3.1.3、安装Mysql 8.353…

TouchGFX 总结

文章目录 使用中文字体多屏幕间交换数据UI to MCUMCU to UI API文档参考横竖屏切换 使用中文字体 添加一个textArea&#xff0c;默认的英文文本可见&#xff0c;输入中文字体后就看不见了&#xff0c;是因为这个默认的字体不支持中文&#xff0c;改一下字体就可以了&#xff1…

全方位解析Node.js:从模块系统、文件操作、事件循环、异步编程、性能优化、网络编程等高级开发到后端服务架构最佳实践以及Serverless服务部署指南

Node.js是一种基于Chrome V8引擎的JavaScript运行环境&#xff0c;专为构建高性能、可扩展的网络应用而设计。其重要性在于革新了后端开发&#xff0c;通过非阻塞I/O和事件驱动模型&#xff0c;实现了轻量级、高并发处理能力。Node.js的模块化体系和活跃的npm生态极大加速了开发…

网络基础-网络设备介绍

本系列文章主要介绍思科、华为、华三三大厂商的网络设备 网络设备 网络设备是指用于构建和管理计算机网络的各种硬件设备和设备组件。以下是常见的网络设备类型&#xff1a; 路由器&#xff08;Router&#xff09;&#xff1a;用于连接不同网络并在它们之间转发数据包的设备…

深入理解网络原理2----UDP协议

文章目录 前言一、UDP协议协议段格式&#xff08;简图&#xff09;校验和 二、UDP与TCP 前言 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;就有了⽹络互连。 一、UDP协议 协…

java发送请求-http和https

http和https区别 1、http是网络传输超文本协议&#xff0c;client---- http------ server 2、httpshttpssl证书&#xff0c;让网络传输更安全 &#xff0c;client---- httpssl------ server 3、ssl证书是需要客户端认可的&#xff0c;注意官方证书和jdk生成的证书的用户来使…

【Github】将github仓库作为图床使用

创建github仓库 首先创建一个github仓库专门用于存储图片&#xff0c;具体步骤如下&#xff1a; 1.点击新的仓库按钮 2.初始配置&#xff1a;随便填写一个仓库名&#xff1b;这里的仓库状态一定要是public公开的&#xff0c;不然后面访问不了图片 下载PicGo PicGo官网 在A…

获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤&#xff1a; 1、确定采集目标&#xff1a;需要明确要采集的商品类别、筛选条件&#xff08;如天猫、价格区间&#xff09;、销量和金额等数据。例如&#xff0c;如果您想了解“小鱼零食”的销量和金额&#xff0c;您需要设定好价…

【面试经典 150 | 数组】文本左右对齐

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

C语言 | Leetcode C语言题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; struct ListNode* rotateRight(struct ListNode* head, int k) {if (k 0 || head NULL || head->next NULL) {return head;}int n 1;struct ListNode* iter head;while (iter->next ! NULL) {iter iter->next;n;}int add n…

【LeetCode刷题记录】230. 二叉搜索树中第K小的元素

230 二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#xff1…

屏蔽罩材质和厚度对屏蔽效能的影响

​ 一&#xff0e;屏蔽效能的影响因素 屏蔽效能的影响因素主要有两个方面&#xff1a;屏蔽材料的特性和厚度&#xff1b;如下图所示&#xff0c;电磁波经过不同媒介时&#xff0c;会在分界面形成反射&#xff0c;穿过界面的电磁波一部分被反射回去&#xff0c;这部分能量损失…

音视频开发之旅——实现录音器、音频格式转换器和播放器(PCM文件转换为WAV文件、使用LAME编码MP3文件)(Android)

本文主要讲解的是实现录音器、音频转换器和播放器&#xff0c;在实现过程中需要把PCM文件转换为WAV文件&#xff0c;同时需要使用上一篇文章交叉编译出来的LAME库编码MP3文件。本文基于Android平台&#xff0c;示例代码如下所示&#xff1a; AndroidAudioDemo Android系列&am…

Leetcode—163. 缺失的区间【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—163. 缺失的区间 实现代码 class Solution { public:vector<vector<int>> findMissingRanges(vector<int>& nums, int lower, int upper) {int n nums.size();vector<vector<int>> an…