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

embedded/2024/9/21 10:38:14/

目录

  • 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.ppmy.cn/embedded/33029.html

相关文章

算法课程笔记——蓝桥云课第六次直播

(只有一个数,或者因子只有一个)先自己打表,找找规律函数就是2的n次方 异或前缀和 相等就抵消 先前缀和再二分

leetCode64. 最小路径和

leetCode64. 最小路径和 题目思路&#xff1a; 代码 class Solution { public:int minPathSum(vector<vector<int>>& grid) {int n grid.size();if(!n) return 0;int m grid[0].size();vector<vector<int>> f(n, vector<int>(m,INT_MAX))…

Mybatis Interview Question Summary

1. In best practice, usually an Xml mapping file will write a Dao interface corresponding to it. What is the working principle of the Dao interface? Can the methods in the Dao interface be overloaded when the parameters are different? Answer: The Dao in…

大语言模型教程与实践(开源)

1.简介 大语言模型&#xff08;Large Language Models, LLMs&#xff09;的兴起确实始于OpenAI在2018年发布的GPT&#xff08;Generative Pre-trained Transformer&#xff09;&#xff0c;这一开创性工作引领了自然语言处理领域的新纪元。随后&#xff0c;2022年底ChatGPT的横…

【Java EE】MyBatis使用注解操作数据库

文章目录 &#x1f340;参数传递&#x1f334;增(Insert)&#x1f338;返回主键 &#x1f343;删(Delete)&#x1f333;改(Update)&#x1f332;查(Select)&#x1f338;起别名&#x1f338;结果映射&#x1f338;开启驼峰命名(推荐) ⭕总结 &#x1f340;参数传递 需求: 查找…

uni-app 从vue3项目创建到Pinia管理数据全局使用 持久化存储数据 详细教程

一、创建uni-app项目 1. 安装HBuilder X&#xff0c;下载地址&#xff1a;https://www.dcloud.io/hbuilderx.html 2. 打开HBuilder X&#xff0c;点击左上角的“文件”->“新建”->“项目”&#xff0c;选择“uni-app”项目模板&#xff0c;填写项目名称和项目路径&…

区块链 | IPFS:IPNS(实操版)

&#x1f98a;原文&#xff1a;Publishing IPNS names Publishing IPNS names with Kubo Step1&#xff1a; 启动你的 IPFS 守护进程&#xff08;如果尚未运行&#xff09;&#xff1a; $ ipfs daemon说明&#xff1a;以 $ 开头的是命令&#xff0c;以 > 开头的是执行结果…

Wpf DataGrid ComboBox 列

遇到的问题 最开始找到的例子要写 Convert, 感觉和 Vue-Elment 的差别比较大后面找到类似与 Vue-Element UI 的写法&#xff0c;开始时数值不更新 关键代码 <DataGridTemplateColumn Header"Digit" Width"100"><DataGridTemplateColumn.CellTem…