笨笨的思想片断

零碎片断,杂七杂八。
posts - 25, comments - 79, trackbacks - 0, articles - 0

DTP/XA 规范及XA API调用研究

Posted on 2007-12-06 14:07 笨笨 阅读(3029) 评论(3)  编辑  收藏 所属分类: Java Service Request Broker
DTP/XA 规范及XA API调用研究

分布式事务(Distributed Transaction Processing/XA)规范是一个业界标准规范,它定义了分布式事务中各方角色和标准两阶段提交的协议规范(XA Protocol),该规范为广为业界所支持(CICS/TUXEDO/Enica,后来的OTS/JTS规范以及微软的MTS的莫不源于此。

XA规范中关键角色简述如下
AP: 客户应用程序,负责连接TM,RM,使用RM的提供的API访问和更改数据,声明分布式事务的开始和结束阶段点(Transaction Demarcation)。
TM: 事务管理器,负责管理、协调、准备和提交分布式事务,对AP的接口标准为TX接口, 并非所有的 TM 实现都遵循这个标准, 但是都会提供类似的接口函数.
RM: 资源管理器,在AP访问数据时,关联事务相关的数据修改,并根据TM的命令提交或回滚数据修改,通常为数据库, IBM MQSeries实现了RM接口。
RM分为静态和动态两种,静态RM需要TM明确调用xa_start/xa_end关联事务与RM的联系. 动态RM在数据发生更改时,会自动回调TM提供的ax_reg/ax_unreg函数,动态关联到当前活动的分布式事务中.



XA API中定义的xa_****和ax_****函数。
ax_reg      向事务管理器注册资源管理器。
ax_unreg     向事务管理器取消注册资源管理器。
xa_close     终止应用程序对资源管理器的使用。
xa_commit     通知资源管理器提交事务分支。
xa_complete     测试异步 xa 操作是否完成。
xa_end     取消线程与事务分支的关联。
xa_forget     允许资源管理器丢弃启发完成的事务分支的信息。
xa_open     初始化资源管理器,供应用程序使用。
xa_prepare     请求资源管理器准备提交事务分支。
xa_recover     获取资源管理器已准备或启发完成的事务标识符 (XID) 列表。
xa_rollback     通知资源管理器回滚事务分支。
xa_start     启动或恢复事务分支;将 XID 与资源管理器请求线程的未来工作关联。

ax_ 例程可让资源管理器调用事务管理器;所有事务管理器必须提供这些例程。在 DTP 环境中操作时,xa_ 例程由资源管理器提供,并由事务管理器调用。当应用程序调用事务管理器以启动全局事务时,事务管理器可以使用 xa_ 接口通知事务分支的资源管理器。

分布式事务各个阶段相关API调用如下:
1 AP 通知TM打开RM连接, AP-->TM tx_open()
TM 会在该函数中调用RM提供的xa_open函数,打开到RM的连接。
在TUXEDO SERVICE中,需要在tpsvrinit()函数中调用tpopen()函数完成这项工作。

2 AP 声明事务开始 AP-->TM tx_begin()
在声明后,该线程后续对RM的所有访问和更新均属于该事务。
对于static RM, TM 需要调用xa_start() 明确关联事务和RM。

在TUXEDO SERVICE/CLIENT中,tpbegin()函数完成类似工作.
当TUXEDO SERVICE被调用时, 如果已经处于事务中, TUXEDO 会自动调用与SERVICE关联的RM的xa_start()函数(只对于 static RM).

3 AP访问RM,使用RM规定的API访问,XA规范未作定义。
对于dynamic RM, 如果访问时发生了数据更改,例如提交一个UPDATE SQL 语句,  RM会自动回调TM的ax_reg函数关联到当前事务.

4 AP声明事务分支结束
在TUXEDO SERVICE调用完成后, 自动调用 RM 的xa_end()函数(对于static RM和未调用ax_unreg的dynamic RM)。

说明: 根据业务需要,上述2-4步骤会在不同的进程(TUXEDO SERVICE)中重复出现, 只要事务ID( Global XID )相同,这多个事务分支(Branch) 均被认为属于同一个事务.

5 AP 要求提交或回滚事务(TM tx_commit/tx_rollback )
AP要求提交事务时, TM 需要检查事务状态, 确定事务并未标记为MARKED_ROLLBACK(只能回滚),否则会回滚并报告错误.

TUXEDO CLIENT/SERVICE 调用 tpcommit/tpabort 提交或回滚事务.
在TUXEDO中,由于实现的原因,所有xa_prepare/xa_commit/xa_rollback都是由单独的TMS进程发起调用的, TUXEDO SERVICE 进程不会发起相关调用.
TUXEDO配置文件中,每个TUXEDO SERVICE GROUP可以关联一个RM和多个TMS,每个GROUP内的SERVICE 进程和TMS进程启动时都会使用相同的 XA OpenInfo String打开到RM的连接.


标准两阶段事务提交过程:
1 (准备)更改事务状态为PREPARING, 依次调用事务关联RM的xa_prepare(), 任意RM返回错误则进入回滚过程, RM都PREPARE完成事务状态改变为PREPARED.
2 (提交)更改事务状态为COMMITTING, 记录事务日志到硬盘中, 依次调用RM的xa_commit方法,再更新事务日志, 更改事务状态为COMMITTED.事务提交完成.
3 (回滚)更改事务状态为ROLLING_BACK, 依次调用事务关联RM的的xa_rollback,更改事务状态为ROLLED_BACK

简化一阶段事务提交过程:
1 (提交)更改事务状态为COMMITTING, 记录事务日志到硬盘中, 调用RM的xa_commit(TMONEPHASE)方法,再更新事务日志, 更改事务状态为COMMITTED.事务提交完成.

启发式事务提交和回滚:
部分RM支持启发式提交或回滚, xa_commit/xa_rollback 返回时,可能会返回XA_HEUR***的值, 表明RM执行了启发式优化.
此时TM需要后续调用RM的xa_forget(), 让RM彻底释放该事务相关的资源.


目前JSRB(Java Service Request Broker)已经部分实现上述TM的功能, 项目继续进展中...: http://jsrb.sourceforge.net

参考资料:
Distributed Transaction Processing_ The XA Specification

IBM WebSphere 开发者技术期刊: 在中间件环境中配置和使用 XA
http://www.ibm.com/developerworks/cn/websphere/techjournal/0704_sood/0704_sood.html

XA接口的一阶段提交与两阶段提交有何区别?
http://www-1.ibm.com/support/docview.wss?uid=csc148256d65004dc82448256d65004276f0

Feedback

# re: DTP/XA 规范及XA API调用研究  回复  更多评论   

2007-12-06 14:17 by 掲示板
看不懂,来顶一下。

# re: DTP/XA 规范及XA API调用研究  回复  更多评论   

2008-03-24 17:57 by kailelv
大哥,还有一本中文的啊,我现在在看英文,看起来很吃力

# re: DTP/XA 规范及XA API调用研究  回复  更多评论   

2008-04-20 23:26 by szwuzh
哥们,哪里有中文版的啊?看英文的眼花啊

只有注册用户登录后才能发表评论。


网站导航: