1. 程式人生 > >Mysql數據庫分布式事務XA詳解

Mysql數據庫分布式事務XA詳解

oar 存儲引擎 成了 from get 分布式事務 value ive 進展

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. 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事務:

[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詳解