JTA事务求助

10-01-06 kenshin54
    

大叫好,我是JAVAEE新手,对于JTA不是很了解。在这里寻求一下帮助。

我有这样一个场景,我有2个APP SERVER,分别部署了2个DATASOURCE,以及使用了各自DATASOURCE的EJB。

现在我需要从其中1个APP SERVER中获取一个事务,执行2个APPSERVER中不同DATASOURCE的EJB业务,请问要保证该事务,我是否应该使用XA事务?

在实际项目中应该会使用WLS,现在测试阶段我用了2个JBOSS,但是我配置的数据源都是local-tx-datasource的,结果是如果我不加事务,2个EJB方法都能成功执行,但是我一旦加上事务,在第二个执行的方法总是会报错。因为我对JTA概念不是很清晰,所以希望有哪位有经验的前辈能分享一下理解,并指点一下我遇到的问题。

由于代码在公司,所以没法贴出整个源码,以下是一些伪代码片段:

我确定我的数据源配置成功,并且EJB也成功部署了。

//...
Context c1 = new InitContext(prop1);
Context c2 = new InitContext(prop1);
//service1在其中一个JBOSSAS中,该JBOSSAS里面配置的是Oracle的local-tx-datasource
Service1 s1 = (Service1)c1.lookup("service1/remote");
//service2在另一个JBOSSAS中,该JBOSSAS里面配置的是mssql2005的local-tx-datasource
Service2 s2 = (Service2)c2.lookup("service2/remote");
UserTransaction ut = (UserTransaction)c1.lookup("java:/UserTransaction");
//以下2个doService方法都执行了insert操作,当无论s1.doService在前还是s2.doService在前
//报错的总是第二个方法,但是当我去掉ut.begin();ut.rollback();就能成功执行,并且数据都能insert到DB中
ut.begin();
s1.doService(bean1);
s2.doService(bean2);
ut.rollback();
<p>

期待大家的帮助

kenshin54

[该贴被kenshin54于2010-01-06 23:34修改过]

    

xmuzyu
2010-01-06 23:42

这种情况肯定需要javax.transaction.xa.XAResource的,你确定你的伪代码是正确的吗?

ut.begin();
s1.doService(bean1);
s2.doService(bean2);
ut.rollback();
<p>

你为什么执行完service后就回滚事务呢?应该是ut.commit()才对吧?

banq
2010-01-07 09:54

2010年01月06日 23:33 "kenshin54"的内容
ut.begin();

s1.doService(bean1);

s2.doService(bean2);

ut.rollback();

好像最后一句rollback写错了,应该是commit吧,只有在exception中写rollback.

具体事务代码可见JiveJdon中案例。

是使用XA才能跨数据库事务,这就是两段事务2PC事务,2PC事务是反可伸缩性模式的,引起很差的性能,是性能和可伸缩性的杀手,除非迫不得已,属于自宫型秘籍。哈哈

kenshin54
2010-01-07 11:31

谢谢楼上2位的回复,我是故意写rollback的,应为我只是在测试,它能不能让我会滚事务。

banq,您好:

我想问一下,如果使用XA和2PC,我是否只需要将数据源配置成支持XA事务的数据源即可,代码方面,是否依旧写成类似如此的写法:

ut.begin();
s1.doService(bean1);
s2.doService(bean2);
ut.commit();
<p>

谢谢指点

kenshin54

banq
2010-01-08 11:01

2010年01月07日 11:31 "kenshin54"的内容
是否依旧写成类似如此的写法

是的