一文搞懂MySQL XA如何实现分布式事务
作者:神技圈子 发布时间:2024-01-22 23:25:19
前言
MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开发一个业务系统,它接受外部的请求,然后访问多个内部其它系统才能执行该请求。执行时我们需要同时更新多个数据库的值(D1,D2,D3)。由于系统必须处于一个一致性,也就是这三个数据库的值要么同时更新成功,要么全部不更新。不然会造成子系统有些指令成功了,有些指令尚未执行。导致对结果理解混乱。
那么,MySQL如何实现多个MySQL数据库更新的一致性呢?那就是MySQL XA。MySQL正是靠支持XA规范的二阶段提交协议,才实现了多个数据库的操作。
XA 协议
提到XA规范就得来聊一下DTP模型(Distributed Transaction Processing)。XA规范就是约定DTP模型中的两个模块事务管理器和资源管理器的通讯方式。DTP其实就是分布式事务处理
各个模块的作用如下:
AP(Application Program):应用程序,定义事务边界(定义事务开始和结束)并访问事务边界内的资源。
RM(Resource Manger)资源管理器: 管理共享资源并提供外部访问接口。供外部程序来访问数据库等共享资源。此外,RM还具有事务的回滚能力。
TM(Transaction Manager)事务管理器:TM是分布式事务的协调者,TM与每个RM进行通信,负责管理全局事务,分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚、失败恢复等。
刚开始看可能觉得不好理解,总结起来该架构就是应用程序访问及使用资环管理器提供的共享资源,通过事务管理器提供的事务接口(TX interface)定义事务操作。事务管理器和资源管理会基于XA规范执行二阶段提交协议。
XA规范流程如下图所示
应用程序AP向事务管理器TM发起事务请求
TM调用xa_open()建立同资源管理器的会话
TM调用xa_start()标记一个事务分支的开头
AP访问资源管理器RM并定义操作,比如插入记录操作
TM调用xa_end()标记事务分支的结束
TM调用xa_prepare()通知RM做好事务分支的提交准备工作。其实就是二阶段提交的提交请求阶段。
TM调用xa_commit()通知RM提交事务分支,也就是二阶段提交的提交执行阶段。
TM调用xa_close管理与RM的会话。
这些接口一定要按顺序执行,比如xa_start接口一定要在xa_end之前。此外,这里千万要注意的是事务管理器只是标记事务分支并不执行事务,事务操作最终是由应用程序通知资源管理器完成的。另外,我们来总结下XA的接口
xa_start:负责开启或者恢复一个事务分支,并且管理XID到调用线程
xa_end:负责取消当前线程与事务分支的关系
xa_prepare:负责询问RM 是否准备好了提交事务分支 xa_commit:通知RM提交事务分支
xa_rollback:通知RM回滚事务分支
如何通过MySQL XA实现分布式事务
Mysql中存在两种XA事务,一种是内部XA事务主要用来协调存储引擎和二进制日志,一种是外部事务可以参与到外部分布式事务中(比如多个数据库实现的分布式事务),这里我们主要讨论外部事务。
注:MySQL中只有当隔离级别设置为Serializable的时候才能使用分布式事务。
MySQL的XA语法如下
XA {START|BEGIN} xid [JOIN|RESUME]
XA PREPARE xid
XA END xid
XA COMMIT xid[ONE PHASE]
XA ROLLBACK xid
XA RECOVER[CONVERT XID ]
其中xid作为事务ID,唯一表示一个事务分支,每个事务分支都有一个id。
首先要确认是否开启了XA 功能
设置隔离级别为serializable
执行结果
首先调用“XA START ‘xid' ”命令把XA事务置于ACTIVATE状态,接着执行构成事务的多条SQL语句(比如 update
t1 set c1 = ‘a' where id=1),也就是指定事务的边界。然后调用“XA END ‘xid' ”把事务放入IDLE状态,也就是结束事务边界。
接着,对于一个处于IDLE状态的XA事务,可以执行“XA PREPARE”命令或一个“XA COMMIT…ONE PHASE”命令,XA
PREPARE来执行二阶段提交协议的提交请求阶段。执行“XA RECOVER”命令会列出处于PREPARED状态的所有XA事务。XA
COMMIT…ONE PHASE用于预备和提交事务,也就是转换为一阶段协议,直接提交事务。
最后,调用“XA COMMIT”来提交事务(或者“XA ROLLBACK”回滚事务)。这样就实现了全局事务的一致性了。
通过上面的流程可以看到,在MySQL数据库分布式事务中,MySQL的角色其实是XA事务过程中的RM,TM是连接MySQL服务器的客户端。在分布式事务中一般会涉及到至少两个RM,所以我们说的MySQL支持XA协议是说mysql作为RM来说的,也就是说MySQL实现了XA协议中RM应该具有的功能。
来源:https://blog.csdn.net/songguangfan/article/details/121194345
猜你喜欢
- 前言numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。本文讲给大家介绍关
- EXEC SQL WHENEVER SQLERROR CONTINUE; sqlglm(msg_buffer, &buf
- 一、图图:数据(张量Tenrsor)+ 操作(节点Operation) (静态)图可以用:1、默认图;2、自定义图。1、默认图查看默认图的方
- 本文实例讲述了thinkPHP框架通过Redis实现增删改查操作的方法。分享给大家供大家参考,具体如下:一、概述Redis是一个NoSQL数
- 这里是WMP的版本ClassID,从WMP7后ID就成了clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6
- 很久没写过东西了,今天看了chinahuman 的《用asp自动解析网页中的图片地址,并将其保存到本地服务器》,于是优化了这个程序,并且将所
- 代码如下: EXEC sp_rename '表名.[原列名]', '新列名', 'column
- 可以,具体说明和代码见下: <%@ Language=VBScript %><%Option
- 前言PHP5.3之后支持了类似Java的jar包,名为phar。用来将多个PHP文件打包为一个文件。首先需要修改php.ini配置将phar
- 数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。举个例子:x
- 下面先给大家介绍下Python3 执行系统命令并获取实时回显最近在改造一些打包的逻辑,原来在 Windows 下是基于批处理制作的,由于批处
- 1. logging日志的介绍在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录;飞机飞行过程中,会有个黑盒子(飞行数据记录器)记
- 1.首先主题选择不要落俗!现在许多的个人主页就象“大锅饭”。题材包罗万象,内容雷同无味。人人都是“软件速递”“音乐宝库”“主页教程”等等。让
- 如下所示:try: f =open("D:/1.txt",'r') f.clos
- 这里我们在SQL Server 2005\SQL Server 2008版本上通过举例子,说明临时表和表变量两者的一些特征,让我们对临时表和
- 本文为大家分享了Navicat for SQLite导入csv中文数据的具体方法,供大家参考,具体内容如下1.用Notepad++打开csv
- python爬虫模块selenium简介selenium主要是用来做自动化测试,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问
- 在设计网页时,经常遇到某些页面需限权访问的情况。比如,一个公司的某些产品只让某一或某些供应商或客户浏览。那么,我们如何实现这一功能呢?本文,
- 分享一个关于在pytest中,如何将测试用例文件中的变量传递到fixture函数。一、交代应用场景目前组内的项目,在根目录下是有一个conf
- 本文实例讲述了Python实现检测文件MD5值的方法。分享给大家供大家参考,具体如下:前面介绍过Python计算文件md5值的方法,这里分析