詳解Mysql資料庫分布式事務XA,附實驗說明

2019-10-10     波波說運維

概述

前面已經介紹了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狀態。


覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~

文章來源: https://twgreatdaily.com/zh-cn/9l5Ns20BMH2_cNUgyNDR.html