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

本文主要是介绍深入理解分布式事务⑨ ---->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 事务。







这篇关于深入理解分布式事务⑨ ---->MySQL 事务的实现原理 之 MySQL 中的XA 事务(基本原理、流程分析、事务语法、简单例子演示)详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满