這裏參考的是Oracle對於XA的支持,其餘的應該雷同吧。。。php
1個分佈式事務由多個行爲在不一樣的數據庫上執行,1個分佈式事務的執行成功意味着相關數據庫上的行爲執行均成功。「XA協定」(http://www.opengroup.org/public/pubs/catalog/c193.htm)就支持分佈式的事務,具有能力,讓多個獨立的事務資源參加全局的事務。事務資源一般是RDBMSs,不過也能夠是其它種類的資源。html
一個典型的全局性事務的架構以下,一般來講TM會集成在Application Server(例如weblogic server)中。這種TM也叫作external TM,區別於在MySQL DBMS或者Oracle DBMS中的管理本地事務的TM。java
資源管理器(RM):用戶提供通向事務的途徑。數據庫服務器(例如上面的Oracal DBMS)是一個種資源管理器。該管理器必須提交or回滾由RM管理的事務。mysql
事務管理器(TM):用於協調做爲一個分佈式事務的一部分事務。一般XA的相關操做都在這裏進行,而對於Client而言是透明的,TM(或許是個進程)一般是由TPM( transaction processing monitor,Texudo就有這個組件,因此Texudo也就本能地支持了全局事務)提供。web
對於Client App而言,全部的Global Transaction都應該經過TM進行(在ORACLE中,是名字爲TX的一組接口函數),TM再與RM經過XA接口(Oracle有提供這組函數)進行接洽。而全部的普通的針對同一個數據庫的事務能夠直接經過Native Interface進行。sql
在Oracle的文檔裏,一個Global Transaction被分爲多個Branch。A branch is a unit of work contained within one RM. In the case of Oracle Database, each branch maps to a local transaction inside the database server.數據庫
理解全局性事務的關鍵是理解兩階段提交:服務器
The Oracle XA library interface follows the two-phase commit protocol. The sequence of events is as follows:架構
下面的一個例子是從Oracle的JDBC文檔裏搞出來的。基本上講清楚了整個過程。特別注意的是,Note that for simplicity, this example combines code that would typically be in a middle tier with code that would typically be in a transaction manager (such as the XA resource method invocations and the creation of transaction IDs).oracle
Oracle XA Code Sample 最底下一段
關於MySQL全局性事務的一些限制,http://jishu.zol.com.cn/4306.html和http://blog.sina.com.cn/s/blog_4673e6030101c7o4.html
一些疑問
對於MySQL的XA支持,若是在XA START/END之間的SQL語句掛了,做爲RM的MySQL如何通知TM?提供的方法裏只有XA PREPARE,在個人理解裏,這個是用於表示第一階段的提交成功了,因而TM就能夠經過查看XA RECOVER看到PREPARE狀態了。那麼如何表示失敗呢?超時總不太靠譜吧?
參考
http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_xa.htm#g1017655
http://docs.oracle.com/cd/B10500_01/java.920/a96654/xadistra.htm
http://liuhaodba.blog.51cto.com/6379925/1117647
http://www.iteedu.com/database/mysql/mysqlmanualcn/sql-syntax/xa.php
http://jishu.zol.com.cn/4306.html
http://blog.sina.com.cn/s/blog_4673e6030101c7o4.html
http://blog.csdn.net/mchdba/article/details/13076803