Java transaction笔记(二)

续[url=http://bluepopopo.iteye.com/admin/blogs/368869]Java transaction笔记(一[/url], 继续我的transaction之旅。这次是XA transaction.

[b]Wiki对于XA的描述[/b]

[quote]在计算技术上,XA规范是 The Open Group关于分布式事务处理 (DTP)的规范。规范描述了全局的事务管理器与局部的资源管理器之间的接口。XA规范的目的是允许的多个资源(如数据库,应用服务器,消息队列,等等)在同一事务中访问,这样可以使ACID属性跨越应用程序而保持有效。XA使用两阶段提交来保证所有资源同时提交或回滚任何特定的事务。

XA规范描述了资源管理器要支持事务性访问所必需做的事情。遵守该规范的资源管理器被称为XA compliant。[/quote]

在j2ee中,典型的应用场景是在[b]同一事务[/b]中应用db和jms,或是不同的db.

public void doSometing()
{
updateDatabase();
sendJMSMessage();
}


在非XA应用中,message一旦被发送至queue或topic,则会立即被接受方消费。所以即使updateData()出错,整个doSometing()需要回滚时,sendJMSMessage()已经提交无法再回滚了。

如果应用了XA,则message一直被保持在queue中直至整个事务提交。

[b]XA的要求[/b]
对于jms来说,需要配置支持XA的 connection factory.
对于db来说,需使用支持XA的JDBC driver.

[b]两阶段提交(2 phase commit)[/b]
先说transaction的管理,如下图。
[img]http://dl.iteye.com/upload/picture/pic/61311/046a643e-1b51-3aa3-9ac2-779f5e4755ea.bmp[/img]
transaction manager与不同的resource manager都有交互。

在phase1时,transaction manager向两个resouce询问是否可以准备提交。Resouce可回复ready, not_ready或是read_only. 当两个都ready时,则可以进入phase2 进行提交。任何一个回复not_ready则整个transaction 回滚。回复read_only的资源在phase2阶段被排除在提交过程之外。
[img]http://dl.iteye.com/upload/picture/pic/61313/dd3536a3-d5fa-3e43-b905-8e13a755c9ca.bmp[/img]

[b]Last resource commit optimization[/b]
有app server可以允许非XA的资源加入到XA的事物中来。简单说来,就是在phase1 XA的资源发送ready 讯号给transaction manager,则立即对非XA的资源进行commit,一旦它成功提交,再对XA的资源进行phase2 提交。 倘若在这个过程中,非XA的资源commit时出错,在phase2 所有的XA的资源都会收到rollback的请求.

当然使用LRCO的问题也还是有的,首先是不同的server对此可能有不同的实现,那么移植将是一个问题。其次就是 使用它会导致 heuristic exception出现的概率上升。

Heuristic exception一般出现于phase1两个资源可能有的timeout.

[b]总结[/b]
使用XA是一件比较麻烦的事,特别是有可能出现一些在local transaction中没有见过的错误,譬如heuristic exception. 还有一个限制,就是在db的procedure中不能出现DDL.

除非你确实需要在[b]同一个事务中管理多个资源[/b],否则尽量选择其他方案。举个例子,有一个EJB需要横跨两个db进行查询,在非XA的情况下,可以第二个db的访问转移到一个local bean的方法中,并将这个方法的事务属性声明为 not supported.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值