XA事务简介

XA 事务的基础是两阶段提交协议。需要有一个事务协调者来保证所有的事务参与者都完成了准备工作(第一阶段)。如果协调者收到所有参与者都准备好的消息,就会通知所有的事务都可以提交了(第二阶段)。MySQL 在这个XA事务中扮演的是参与者的角色,而不是协调者(事务管理器)。

mysql 的XA事务分为内部XA和外部XA。 外部XA可以参与到外部的分布式事务中,需要应用层介入作为协调者;内部XA事务用于同一实例下跨多引擎事务,由Binlog作为协调者,比如在一个存储引擎提交时,需要将提交信息写入二进制日志,这就是一个分布式内部XA事务,只不过二进制日志的参与者是MySQL本身。 Mysql 在XA事务中扮演的是一个参与者的角色,而不是协调者。

MySQL XA 事务基本语法

XA {START|BEGIN} xid [JOIN|RESUME]     启动一个XA事务 (xid 必须是一个唯一值; [JOIN|RESUME]  字句不被支持)

XA END xid [SUSPEND [FOR MIGRATE]]   结束一个XA事务 ( [SUSPEND [FOR MIGRATE]] 字句不被支持)

XA PREPARE xid    准备

XA COMMIT xid [ONE PHASE]    提交XA事务

XA ROLLBACK xid  回滚XA事务

XA RECOVER   查看处于PREPARE 阶段的所有XA事务

事务标识符xid

xid 是一个事务标识符,它由客户端提供或者有mysql服务器生成。

xid的格式一般为 xid : gtrid [, bqual [, formatID]] ;gtrid是一个全局事务标识符,bqual是一个分支限定符,formatID是一个数字,用于标识由gtrid和bqual值使用的格式。根据语法的表示,bqual和formatID是自选的。如果没有给定,默认的bqual值是''。如果没有给定,默认的fromatID值是1。

XA事务状态进展过程

1. 使用XA START 启动一个XA事务,并把它置为ACTIVE状态。

2. 对一个ACTIVE XA事务,发布构成事务的SQL语句,然后发布一个XA END 语句,XA END 把事务置为IDLE状态。

3. 对一个IDLE XA 事务, 发布一个XA PREPARE语句或者一个XA COMMIT ... ONE PHASE语句: 前者把事务置为PREPARE状态,此时XA RECOVER 语句的输出包含事务的xid值(XA RECOVER 语句会列出所有处于PREPARE状态的XA事务); 后者用于预备和提交事务,不会被XA RECOVER列出,因为事务已经终止。

4. 对一个PREPARE XA 事务,可以发布一个XA COMMIT语句来提交和终止事务,或者发布一个XA ROLLBACK 来回滚并终止事务。

简单的XA事务操作流程

  1. mysql> XA START 'xatest';
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> INSERT INTO test (name,tel) VALUES ('123','123');
  4. Query OK, 1 row affected (0.00 sec)
  5. mysql> XA END 'xatest';
  6. Query OK, 0 rows affected (0.00 sec)
  7. mysql> XA PREPARE 'xatest';
  8. Query OK, 0 rows affected (0.00 sec)
  9. mysql>
  10. mysql>
  11. mysql> XA COMMIT 'xatest';
  12. Query OK, 0 rows affected (0.00 sec)

XA RECOVER 介绍

XA RECOVER 列出所有处于PREPARE状态的XA事务:

  1. mysql> XA RECOVER;
  2. +----------+--------------+--------------+--------+
  3. | formatID | gtrid_length | bqual_length | data   |
  4. +----------+--------------+--------------+--------+
  5. |        1 |            6 |            0 | xa1000 |
  6. +----------+--------------+--------------+--------+
  7. 1 row in set (0.00 sec)

注释:

1. formatID 是事务xid的formatID部分。

2. gtrid_length 是xid的gtrid部分的长度,以字节为单位。

3. bqual_length 是xid的bqual部分的长度,以字节为单位。

4. data 是xid的gtrid部分和bqual部分的串联。

在用一个客户端环境下,XA事务和本地(非XA)事务互相排斥,如果已经发布了XA START来开启一个事务,则本地事务不会被启动,知道XA事务被提交或者被回滚为止;相反的,如果已经使用START TRANSACTION启动一个本地事务,则XA语句不能被使用,直到该事务被提交或者回滚为止,而且XA事务仅仅被InnoDB存储引擎支持。

如果XA事务达到PREPARE状态时MySQL服务器宕机,当服务器重启后,服务器会回滚任何未完成的XA事务,即使该事务已经达到了PREPARE状态;如果客户端连接终止,而服务器继续运行,服务器将回滚任何未完成的XA事务,即使该事务已经达到PREPARED状态。

Mysql数据库分布式事务XA详解的更多相关文章

  1. MySQL数据库分布式事务XA优缺点与改进方案

    1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...

  2. DTP模型之一:(XA协议之三)MySQL数据库分布式事务XA优缺点与改进方案

    1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...

  3. Mysql数据库导入命令Source详解

    Mysql数据库导入命令Source详解 几个常用用例: 1.导出整个数据库 mysqldump -u 用户名 -p 数据库名 > 导出的文件名 mysqldump -u root -p dat ...

  4. 数据库分布式事务XA规范介绍及Mysql底层实现机制

    1. 引言 分布式事务主要应用领域主要体现在数据库领域.微服务应用领域.微服务应用领域一般是柔性事务,不完全满足ACID特性,特别是I隔离性,比如说saga不满足隔离性,主要是通过根据分支事务执行成功 ...

  5. MySQL数据库安装与配置详解(图文)

    接下来看一下如何安装mysql数据库. 由于有更详细的教程资源,因此参考别人的文章以整理.安装教程参考自博客园文章http://www.cnblogs.com/sshoub/p/4321640.htm ...

  6. python操作mysql数据库的常用方法使用详解

    python操作mysql数据库 1.环境准备: Linux 安装mysql: apt-get install mysql-server 安装python-mysql模块:apt-get instal ...

  7. Mysql数据库配置文件my.cnf详解

    basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = path 给出存放着字符集的目录. datadir = path 从给定目录读取数据库文件 ...

  8. MySQL数据库表分区功能详解

    1.什么是表分区? mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表 ...

  9. MySQL数据库安装配置步骤详解

    MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Comple ...

随机推荐

  1. 阿里云短信服务验证码封装类 - PHP

    本文记录在ThinkPHP6.0中使用阿里云短信验证码,该封装类不仅仅局限于TP,拿来即用 使用该类之前必须引入 flc/dysms 扩展,该封装类就是基于这个扩展写的 composer requir ...

  2. 安装paddle的问题,报错Can not find library: libcudnn.so. The process maybe hang.

    今天在服务器上安装paddle的GPU版时报错 报错截图如下: 其实报错已经提示的很明显了,就是要添加一个环境变量.但我想到我之前并没有在全局环境下安装cudnn,以为是这个原因.因为之前安装pyto ...

  3. linux下禁止root和匿名用户登录ftp

    1.ftp通过root或其他用户进入可视化界面权限过大,容易导致系统文件误删 windows下输入ftp://IP去访问,不需要账号密码就可以访问到ftp文件夹 刚进去pub是空的,在linux上新增 ...

  4. python中绑定码云仓库

    1.File——Settings——Version Control——Git——输入git安装路径下bin下的git.exe路径——点击后面的Test测试一下,弹出版本点击ok即可 2.点击工具栏中的 ...

  5. 乔悟空-CTF-i春秋-Web-GetFlag

    2020.09.07 今天发生了一些事情,世事无常,哎.好好的享受当下,该吃吃该喝喝好吧.人活一辈子,到底为了啥? 做题 题目 题目地址 做题 这个题目还行,思路比较清晰,没那么多奇怪的脑洞

  6. Kafka实战宝典:Kafka的控制器controller详解

    一.控制器简介 控制器组件(Controller),是 Apache Kafka 的核心组件.它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群.集群中任意一 ...

  7. java 单例模式的几种写法

    一.懒汉式 public class Singleton{ private static Singleton instance = null; private Singleton(){} public ...

  8. lombok使用(给自己看的,只为不要忘记自己用过的技术)

    如何使用? 一.1)eclipse使用方法 1. 从项目首页下载lombok.jar 2. 双击lombok.jar, 将其安装到eclipse中(该项目需要jdk1.6+的环境) 2)idea使用方 ...

  9. dubbo学习(八)dubbo项目搭建--消费者(服务消费者)

    PS:  项目架子以及工程间的maven依赖配置暂时省略,后续看情况可能会单独写一篇文章捋捋框架结构,先马克~ 配置和启动 1.pom文件引入dubbo和zookeeper的操作客户端(此步骤与生产者 ...

  10. Processing 网格(棋盘格)无限偏移纹理动画

    过火 再度出击!这次我们要玩得更火一点---把静帧变动画.没错,将棋盘格动起来!看一下效果: 这是一个经典的无限偏移动画,在很多2d横版射击游戏中都会采用的技术.如何在Processing中实现,有两 ...