概述
前面已經介紹了2PC和3PC方面的內容,那么MySQL數據庫在分布式事務這塊又是怎么規劃呢?
XA事務簡介
XA 事務的基礎是兩階段提交協議。需要有一個事務協調者來保證所有的事務參與者都完成了準備工作(第一階段)。如果協調者收到所有參與者都準備好的消息,就會通知所有的事務都可以提交了(第二階段)。Mysql 在這個XA事務中扮演的是參與者的角色,而不是協調者(事務管理器)。
Mysql 的XA事務分為內部XA和外部XA。 外部XA可以參與到外部的分布式事務中,需要應用層介入作為協調者;內部XA事務用于同一實例下跨多引擎事務,由Binlog作為協調者,比如在一個存儲引擎提交時,需要將提交信息寫入二進制日志,這就是一個分布式內部XA事務,只不過二進制日志的參與者是MySQL本身。
MySQL 從5.0.3開始支持XA分布式事務,且只有InnoDB存儲引擎支持。MySQL Connector/J 從5.0.0版本之后開始直接提供對XA的支持。
需要注意的是, 在DTP模型中,mysql屬于資源管理器(RM)。而一個完整的分布式事務中,一般會存在多個RM,由事務管理器TM來統一進行協調。因此,這里所說的mysql對XA分布式事務的支持,一般指的是單臺mysql實例如何執行自己的事務分支。
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事務操作流程
mysql> XA START 'xatest'; mysql> INSERT INTO t VALUES (1,'hwb'); mysql> XA END 'xatest'; mysql> XA PREPARE 'xatest'; mysql> XA COMMIT 'xatest';
XA RECOVER 介紹
XA RECOVER 列出所有處于PREPARE狀態的XA事務:
mysql> XA RECOVER;
字段說明:
- formatID 是事務xid的formatID部分。
- gtrid_length 是xid的gtrid部分的長度,以字節為單位。
- bqual_length 是xid的bqual部分的長度,以字節為單位。
- data 是xid的gtrid部分和bqual部分的串聯。
在用一個客戶端環境下,XA事務和本地(非XA)事務互相排斥,如果已經發布了XA START來開啟一個事務,則本地事務不會被啟動,知道XA事務被提交或者被回滾為止;相反的,如果已經使用START TRANSACTION啟動一個本地事務,則XA語句不能被使用,直到該事務被提交或者回滾為止,而且XA事務僅僅被InnoDB存儲引擎支持。
如果XA事務達到PREPARE狀態時MySQL服務器宕機,當服務器重啟后,服務器會回滾任何未完成的XA事務,即使該事務已經達到了PREPARE狀態;如果客戶端連接終止,而服務器繼續運行,服務器將回滾任何未完成的XA事務,即使該事務已經達到PREPARED狀態。