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 都必須是字符串類型却特,長(zhǎng)度是64byte扶供,formatID是無符號(hào)整型。
![](http://upload-images.jianshu.io/upload_images/4067391-407501a403521e12.png@wm_2,t_55m+5a625Y+3L0tPS08yMDE5,fc_ffffff,ff_U2ltSGVp,sz_14,x_9,y_9?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我們來看個(gè)實(shí)際例子
![](http://upload-images.jianshu.io/upload_images/4067391-b853652ea78e6110.png@wm_2,t_55m+5a625Y+3L0tPS08yMDE5,fc_ffffff,ff_U2ltSGVp,sz_16,x_10,y_10?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我建立了一個(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ù)和以上方式類似阶牍,后面有空整理出代碼