Mysql對(duì)XA的支持

mysql8.0文檔:https://dev.mysql.com/doc/refman/8.0/en/xa-statements.html。13.3.8.1 XA Transaction SQL Syntax章節(jié)講述了Mysql對(duì)于XA事務(wù)的語法。

XA {START|BEGIN} xid [JOIN|RESUME] XA END xid [SUSPEND [FOR MIGRATE]] XA PREPARE xid XA COMMIT xid [ONE PHASE] XA ROLLBACK xid XA RECOVER [CONVERT XID]

首先,根據(jù)DTP(Distributed Transaction Processing: Reference Model)參考模型中,Mysql是作為資源管理器這一組件。所以Mysql也僅僅是作為XA規(guī)范中的一個(gè)組件而已,Mysql對(duì)于XA的支持,其實(shí)是提供了RMs與TM之間的接口交互支持。TM(Transaction manager)是一個(gè)事務(wù)的協(xié)調(diào)者,協(xié)調(diào)眾多的事務(wù)參與者。明白了這一點(diǎn)以后,我們?cè)賮砜碝ysql中使用XA事務(wù)的語法,mysql官方文檔中也有詳細(xì)的描述,我們?cè)谙旅媪信e一二,另外關(guān)于mysql支持XA是從什么版本開始,以及java驅(qū)動(dòng)包什么版本支持XA,請(qǐng)見以下文檔原文

Support for XA transactions is available for the

InnoDB

storage engine. The MySQL XA implementation is based on the X/Open CAE document?Distributed Transaction Processing: The XA Specification. This document is published by The Open Group and available athttp://www.opengroup.org/public/pubs/catalog/c193.htm. Limitations of the current XA implementation are described in Section C.6, “Restrictions on XA Transactions”.

innodb存儲(chǔ)引擎支持XA事務(wù)

Among the MySQL Connectors, MySQL Connector/J 5.0.0 and higher supports XA directly, by means of a class interface that handles the XA SQL statement interface for you.

5.0.0版本mysql連接驅(qū)動(dòng)開始支持XA

XA事務(wù)命令都是XA開頭的,xa start 和 xa begin 都可以開啟一個(gè)xa事務(wù),但是xa start 不支持join 、resume,這兩個(gè)是什么,我暫時(shí)不了解,暫且不管,xa start 還需要跟一個(gè)xid,這個(gè)是事務(wù)的唯一標(biāo)識(shí),關(guān)于xid的構(gòu)成,下面再詳述,這里僅需要知道xid是一個(gè)事務(wù)的id標(biāo)識(shí)即可。

xa end xid,即完成sql 操作后,讓xa事務(wù)進(jìn)入IDLE狀態(tài)的命令,同樣要指明xid,操作的是哪個(gè)XA事務(wù),注意這里xa end并不是要結(jié)束xa事務(wù),只是進(jìn)入到IDLE狀態(tài),后續(xù)還有兩階段提交過程,prepare和commit;

xa prepare xid ,標(biāo)識(shí)兩階段提交的第一個(gè)提交階段,通知資源管理器RM做提交前的準(zhǔn)備,防止數(shù)據(jù)丟失,之前討論兩階段提交時(shí)已經(jīng)講了,這個(gè)階段,mysql就會(huì)記錄下這個(gè)事務(wù)的各種日志,防止丟失,即使宕機(jī)重啟也能恢復(fù)。prepare結(jié)束就具備了這種恢復(fù)的能力,RM prepare回復(fù)TM,prepare成功后,RM會(huì)等TM的commit通知,而TM要等所有RM的成功消息,所有RM回復(fù)成功,TM就下發(fā)commit給所有RM;如果部分RM回復(fù)不成功,那么TM就下發(fā)rollback給所有RM回滾事務(wù)。

xa rollback xid就是回滾事務(wù)的指令,xa commit xid就是提交事務(wù)的指令,xa commit xid ONE PHASE 是明確知道RM只有一個(gè)的情況下,采用一階段提交的方式,這種情況下就不需要prepare階段了,xa end后即可xa commit xid ONE PHASE了。

xa recover ,是用來查看哪些xid已經(jīng)完成prepare的,異常宕機(jī)情況下,xa recover也能列出宕機(jī)前哪些xa事務(wù)完成prepare,等待commit的。

xid: gtrid [, bqual [, formatID ]]

以上是xid的構(gòu)成,gtrid全局事務(wù)id標(biāo)識(shí),然后bqual 事務(wù)分支標(biāo)識(shí),formatID是格式標(biāo)識(shí),具體什么用處暫時(shí)不明白。bqual和formatID都是可選,如果不給值時(shí)默認(rèn)值分別為”和1.

gtrid 和 bqual 都必須是字符串類型,長度是64byte,formatID是無符號(hào)整型。

我們來看個(gè)實(shí)際例子

我建立了一個(gè)全局事務(wù)aaa,兩個(gè)分支事務(wù)bbb和ccc。然后兩個(gè)分支事務(wù)都進(jìn)入了prepare,從分支事務(wù)ccc截圖中xa recover可以看出。但是ccc回滾,bbb提交。最開始理解這塊的時(shí)候,我認(rèn)為既然一個(gè)全局事務(wù),那么怎么能夠一個(gè)回滾一個(gè)提交呢?后來仔細(xì)一想,這個(gè)過程應(yīng)該是交給TM來統(tǒng)一的,mysql支持XA并不體現(xiàn)在控制全局事務(wù)下所有子事務(wù)一致提交,而是提供和TM交互的接口,由TM最終來控制,通知所有子事務(wù)提交,或都回滾,而不會(huì)通知部分提交、部分回滾。

編程的方式使用XA事務(wù)和以上方式類似,后面有空整理出代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 五、MySQL 中基于 XA 實(shí)現(xiàn)的分布式事務(wù) 5.1 XA協(xié)議 首先我們來簡要看下分布式事務(wù)處理的XA規(guī)范 可知...
    阿里加多閱讀 8,521評(píng)論 0 9
  • 引言 在MySQL 5.7.7版本中,Oracle 官方將MySQL XA 一直存在的一個(gè)“bug” 進(jìn)行了修復(fù),...
    foreversunyao閱讀 19,078評(píng)論 2 14
  • 初識(shí)Open/X XA XA是DTP的一部分接口規(guī)范。 Distributed Transaction Proce...
    john_zhong閱讀 7,045評(píng)論 1 6
  • MySQL分布式事務(wù)介紹 InnoDB存儲(chǔ)引擎提供了對(duì)XA事務(wù)的支持,并通過XA事務(wù)來支持分布式事務(wù)的實(shí)現(xiàn)。分布式...
    張偉科閱讀 9,720評(píng)論 0 10
  • 1、事務(wù)簡介 ? 事務(wù)(Transaction)是訪問并可能更新數(shù)據(jù)庫中各種數(shù)據(jù)項(xiàng)的一個(gè)程序執(zhí)行單元(u...
    逗逼程序員閱讀 771評(píng)論 0 1

友情鏈接更多精彩內(nèi)容