问题描述
最近的任务是里了解XA协议。要了解XA协议,必须先了解X/OpenDTP模型,稍微总结一下:X/OpenDTP(DistributedTransactionProcess)是一个分布式事务模型。这个模型主要使用了两段提交(2PC-Two-Phase-Commit)来保证分布式事务的完整性。在这个模型里面,有三个角色:AP:Application,应用程序。也就是业务层。哪些操作属于一个事务,就是AP定义的。TM:TransactionManager,事务管理器。接收AP的事务请求,对全局事务进行管理,管理事务分支状态,协调RM的处理,通知RM哪些操作属于哪些全局事务以及事务分支等等。这个也是整个事务调度模型的核心部分。RM:ResourceManager,资源管理器。一般是数据库,也可以是其他的资源管理器,如消息队列(如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协议(XASpecification),指的是TM和RM之间的接口。其实这个协议只是定义了xa_和ax_系列的函数原型以及功能描述、约束和实施规范等。至于RM和TM之间通过什么协议通信,则没有提及。目前知名的数据库,如Oracle,DB2等,都是实现了XA接口的,都可以作为RM。Tuxedo、TXseries等事务中间件可以通过XA协议跟这些数据源进行对接。Tuxedo使用TMS(开关文件)进行对各个RM的注册。TMS文件生成通过一个类似编译链接的方式完成。(这点我有点不是十分确定。如有错误请各位纠正)。Tuxedo分为客户端和服务端程序。按照我的理解,客户端就是AP,服务端是TMJTA(JavaTransactionAPI)是符合X/OpenDTP的一个编程模型,事务管理和资源管理器支架也是用了XA协议。WebSphere本身也实现了JTA接口,其中TM和RM之间也是使用XA协议和二段提交。WebSphere也可以通过XMLlink/XMLlinkWrapper和Tuxedo实现对接。WebLogic可以通过WTC(WebLogicTuxedoConnector)和Tuxedo进行对接。
解决方案
解决方案二:
http://www.infoq.com/cn/articles/xa-transactions-handle感觉这里说的比较清晰