深入理解分布式事务⑨ ---->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

相关文章

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构