Mysql数据库分布式事务XA详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql数据库分布式事务XA详解相关的知识,希望对你有一定的参考价值。

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事务操作流程

 

[plain] view plain copy
 
 print?
  1. mysql> XA START ‘xatest‘;  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4. mysql> INSERT INTO test (name,tel) VALUES (‘123‘,‘123‘);  
  5. Query OK, 1 row affected (0.00 sec)  
  6.   
  7. mysql> XA END ‘xatest‘;  
  8. Query OK, 0 rows affected (0.00 sec)  
  9.   
  10. mysql> XA PREPARE ‘xatest‘;  
  11. Query OK, 0 rows affected (0.00 sec)  
  12.   
  13. mysql>   
  14. mysql>   
  15. mysql> XA COMMIT ‘xatest‘;  
  16. Query OK, 0 rows affected (0.00 sec)  

 

 

XA RECOVER 介绍

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

 

[python] view plain copy
 
 print?
  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详解的主要内容,如果未能解决你的问题,请参考以下文章

分布式事务详解

Mysql分布式事务

MySQL 中基于 XA 实现的分布式事务

万字长文详解Shardingsphere对XA分布式事务的支持

## 分布式事务面试官问我:MySQL中的XA事务崩溃了如何恢复??

一文搞懂MySQL XA如何实现分布式事务