关于分布式事务处理的问题

03-10-29 difficult
                   

下面的代码能将sessionA和sessionB中的两方法作为同一事务处理。

try{

InitialContext initial=new InitialContext();

UserTransaction ut=(UserTransaction)initial.lookup("java:comp/UserTransaction"); //1

SessionAHome aHome=(SessionAHome)initail.lookup("SessionA"); //2

SessionA a=aHome.create();

SessionBHome bHome=(SessionBHome)initail.lookup("SessionB"); //2

SessionB b=bHome.create();

ut.begin(); //3

a.fa();

b.fb();

ut.commit(); //4

}

catch(.....){

ut.rollback();

}

1处得到一UserTransaction对象ut,2处分别得到两个sessionbean的对象,但是ut,与a,b之间并没有关联,那当3处ut.begin();时,jts如何知道将事务对象在a.fa()中所操作的资源管理器与b.fb()中所操作的资源管理器之间传播,又如何当4处ut.commit()时,对这两个资源管理器进行两阶段提交,这其中有什么澳妙吗?

                   

无道
2003-10-29 18:48

奥妙在于存在于它们之间的但不易被人发觉的对象,那就是----线程,JTA规范中明确地描述了使用线程来传播事务。当调用ut.begin()时,事务管理器创建一个新的事务对象,并将其绑定到当前线程上,这样事务资源就可以从当前执行的线程获得事务对象进行操作。

adiange
2003-10-29 19:34

这个要根据你申明的B的事务属性来决定

ejb的事务属性包括required requirednew support notsupport

mandatory never

假设A的事务为T1,B的事务为T2,下面就是B的事务将会根据B的事务属性以及A的事务状态,采用不同的事务状态。

B的属性       A的事务  B的事务
required      none    T2
              T1      T1
requirednew   none    T2
              T1      T2
supports      none    none
              T1      T1
notsupport    none    none
              T1      none
mandatory     none    error
              T1      T1
never         none    none
              T1      error

<p>

shenli
2003-10-30 12:11

而且RMI可以传递事务上下文,才能联系不同VM的线程

difficult
2003-10-30 14:13

谢谢上面各位,本人才疏学浅,能不能将详细一点,如怎样对线程进行绑定,是在编译时还是在运行时进行的,我对这种机理觉得太神奇。

4Go 1 2 3 4 下一页