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狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM