最近的任务是里了解XA协议。要了解XA协议,必须先了解X/Open DTP模型,稍微总结一下:
X/Open DTP(Distributed Transaction Process)是一个分布式事务模型。这个模型主要使用了两段提交(2PC - Two-Phase-Commit)来保证分布式事务的完整性。在这个模型里面,有三个角色:
- AP: Application,应用程序。也就是业务层。哪些操作属于一个事务,就是AP定义的。
- TM: Transaction Manager,事务管理器。接收AP的事务请求,对全局事务进行管理,管理事务分支状态,协调RM的处理,通知RM哪些操作属于哪些全局事务以及事务分支等等。这个也是整个事务调度模型的核心部分。
- RM:Resource Manager,资源管理器。一般是数据库,也可以是其他的资源管理器,如消息队列(如JMS数据源),文件系统等。
三者之间的关系如图:
一般的编程方式是这样的:
1. 配置TM,通过TM或者RM提供的方式,把RM注册到TM。可以理解为给TM注册RM作为数据源。一个TM可以注册多个RM。
1. AP从TM获取资源管理器的代理(例如:使用JTA接口,从TM管理的上下文中,获取出这个TM所管理的RM的JDBC连接或JMS连接)
2. AP向TM发起一个全局事务。这时,TM会通知各个RM。XID(全局事务ID)会通知到各个RM。
3. AP通过1中获取的连接,直接操作RM进行业务操作。这时,AP在每次操作时把XID(包括所属分支的信息)传递给RM,RM正是通过这个XID与2步中的XID关联来知道操作和事务的关系的。
4. AP结束全局事务。此时TM会通知RM全局事务结束。
5. 开始二段提交,也就是prepare - commit的过程。
XA协议(XA Specification),指的是TM和RM之间的接口。
其实这个协议只是定义了xa_和ax_系列的函数原型以及功能描述、约束和实施规范等。至于RM和TM之间通过什么协议通信,则没有提及。
目前知名的数据库,如Oracle, DB2等,都是实现了XA接口的,都可以作为RM。Tuxedo、TXseries等事务中间件可以通过XA协议跟这些数据源进行对接。
Tuxedo使用TMS(开关文件)进行对各个RM的注册。TMS文件生成通过一个类似编译链接的方式完成。(这点我有点不是十分确定。如有错误请各位纠正)。Tuxedo分为客户端和服务端程序。按照我的理解,客户端就是AP,服务端是TM
JTA(Java Transaction API)是符合X/Open DTP的一个编程模型,事务管理和资源管理器支架也是用了XA协议。
WebSphere本身也实现了JTA接口,其中TM和RM之间也是使用XA协议和二段提交。
WebSphere也可以通过XMLlink/XMLlink Wrapper和Tuxedo实现对接。
WebLogic可以通过WTC(WebLogic Tuxedo Connector)和Tuxedo进行对接。