mysql xa_Mysql对XA的支持
mysql8.0文檔:https://dev.mysql.com/doc/refman/8.0/en/xa-statements.html。13.3.8.1 XA Transaction SQL Syntax章節講述了Mysql對于XA事務的語法。
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]
首先,根據DTP(Distributed Transaction Processing: Reference Model)參考模型中,Mysql是作為資源管理器這一組件。所以Mysql也僅僅是作為XA規范中的一個組件而已,Mysql對于XA的支持,其實是提供了RMs與TM之間的接口交互支持。TM(Transaction manager)是一個事務的協調者,協調眾多的事務參與者。明白了這一點以后,我們再來看Mysql中使用XA事務的語法,mysql官方文檔中也有詳細的描述,我們在下面列舉一二,另外關于mysql支持XA是從什么版本開始,以及java驅動包什么版本支持XA,請見以下文檔原文
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存儲引擎支持XA事務
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連接驅動開始支持XA
XA事務命令都是XA開頭的,xa start 和 xa begin 都可以開啟一個xa事務,但是xa start 不支持join 、resume,這兩個是什么,我暫時不了解,暫且不管,xa start 還需要跟一個xid,這個是事務的唯一標識,關于xid的構成,下面再詳述,這里僅需要知道xid是一個事務的id標識即可。
xa end xid,即完成sql 操作后,讓xa事務進入IDLE狀態的命令,同樣要指明xid,操作的是哪個XA事務,注意這里xa end并不是要結束xa事務,只是進入到IDLE狀態,后續還有兩階段提交過程,prepare和commit;
xa prepare xid ,標識兩階段提交的第一個提交階段,通知資源管理器RM做提交前的準備,防止數據丟失,之前討論兩階段提交時已經講了,這個階段,mysql就會記錄下這個事務的各種日志,防止丟失,即使宕機重啟也能恢復。prepare結束就具備了這種恢復的能力,RM prepare回復TM,prepare成功后,RM會等TM的commit通知,而TM要等所有RM的成功消息,所有RM回復成功,TM就下發commit給所有RM;如果部分RM回復不成功,那么TM就下發rollback給所有RM回滾事務。
xa rollback xid就是回滾事務的指令,xa commit xid就是提交事務的指令,xa commit xid ONE PHASE 是明確知道RM只有一個的情況下,采用一階段提交的方式,這種情況下就不需要prepare階段了,xa end后即可xa commit xid ONE PHASE了。
xa recover ,是用來查看哪些xid已經完成prepare的,異常宕機情況下,xa recover也能列出宕機前哪些xa事務完成prepare,等待commit的。
xid: gtrid [, bqual [, formatID ]]
以上是xid的構成,gtrid全局事務id標識,然后bqual 事務分支標識,formatID是格式標識,具體什么用處暫時不明白。bqual和formatID都是可選,如果不給值時默認值分別為”和1.
gtrid 和 bqual 都必須是字符串類型,長度是64byte,formatID是無符號整型。
我們來看個實際例子
我建立了一個全局事務aaa,兩個分支事務bbb和ccc。然后兩個分支事務都進入了prepare,從分支事務ccc截圖中xa recover可以看出。但是ccc回滾,bbb提交。最開始理解這塊的時候,我認為既然一個全局事務,那么怎么能夠一個回滾一個提交呢?后來仔細一想,這個過程應該是交給TM來統一的,mysql支持XA并不體現在控制全局事務下所有子事務一致提交,而是提供和TM交互的接口,由TM最終來控制,通知所有子事務提交,或都回滾,而不會通知部分提交、部分回滾。
編程的方式使用XA事務和以上方式類似,后面有空整理出代碼
總結
以上是生活随笔為你收集整理的mysql xa_Mysql对XA的支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rabbitmq+topic+java_
- 下一篇: Linux(Ubuntu)下设置开机自启