JTA和EJB的一些困惑,请高手解答!~

abenqq 09-04-17
    

Class A(){
...
javax.transaction.UserTransaction tx = new InitialContext().lookup ("javax.transaction.UserTransaction");
tx.begin();
EJB1();
EJB2();
...
if(error){
tx.rollback();
}else{
tx.commit();
}

EJB1(){
...
Connection con = ds.getConnection();
//执行插入更新操作
con.close(); //?关闭后能提交吗
}
请教各位高手,我有一些疑问,当使用JTA来控制全局事务时,调用EJB1时,EJB1做执行更新插入操作,操作完数据库连接不是要释放掉吗?如果释放掉,全局事务提交还起作用吗?数据库连接是建基于XA的,如果处理关闭问题呢?在线等回答~!!
[该贴被admin于2009-04-17 20:17修改过]
[该贴被admin于2009-04-19 07:14修改过]

    

banq
2009-04-17 20:21

你需要了解一下EJB事务,看看精通EJB就可以
JTA一般是扁平事务,ejb1 ejb2的事务可配置为required.NEW等,可以加入当前JTA事务。

需要JTA事务起作用,数据库的DS获得必须使用容器的JNDI,这样JTA事务才会有效,那么数据库关闭对JTA事务不一定提交,只有commit之后才真正提交。具体自己可以测试一下。

xmuzyu
2009-04-18 02:09

不会提交的,只不过调用XRourse.end(Xid)方法而已,标记这个事务的一部分,然后EJB2方法调用开始的时候,事务管理器调用XAResource.start(Xid)方法,等EJB2调用结束后,XAResource.end(Xid),这样在你整整commit的时候,依次调用每个XAResource的prepare(Xid),如果返回OK,那么提交,否则只有有一个失败,都失败,这其实就是2PC,两阶段提交协议,JTA规范写的很清楚的。

abenqq
2009-04-18 10:13

谢谢banq和xmuzyu的解答!
可能我的问题没描述清楚。我这个应用是分布式跨多数据库的,需要一个中心端来做事务总控,所以采用JTA。EJB是调用远程的具体业务服务,EJB服务与后台数据库交互是采用jdbc,每次从jndi取连接,执行完不是要close。如果不close,就没法释放连接。如果close的话,全局事务是不是没法提交?疑问就是在这。

xmuzyu
2009-04-18 10:34

你的JNDI DS得到的connection是真正的connection的代理,你close仅仅只是释放了连接到DS,然后下个EJB方法调,JTA事务管理器会给你另外一个connection,并且需要注意的是JTA中,每个connecton(XAConnection)都会与一个XAResource(关联),这样每次方法调用开始时,JTA事务管理器调用XAResource.start(Xid)方法标记事务开始,方法调用结束后,调用XAReource.end(Xid)方法标记事务结束,等你最后用JNDI暴漏的UserTransaction.commit的时候,JTA事务分布式协调器会让与每个XAResource关联的事务管理调用相应的XAResource.prepare(Xid)方法,如果每个事务管理器都回答OK,那么就调用XAResource.commit方法来提交事务。所以JTA事务中,你获得东西都是已经被装饰了的,事务有JTA事务管理器管理,并且一般还有个JTA事务分布式协调器的概念(这个一般是APP SERVER).

2Go 1 2 下一页