这里参考的是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