日期:2014-05-18  浏览次数:20719 次

spring注入多个远程sessionbean,调用其多个方法,如何控制事务


结构如图所示,
ejb容器中,单个session,我可以用容器管理事务。但现在将session注入到客户端spring管理的普通bean中,在该普通bean的方法中,调用多个sessionbean的多个方法,我如何控制事务。

求教各位大牛,完成后追加50分。

------解决方案--------------------
问题一:
在action中通过手动获取UserTransaction,sessionbean1和sessionbean2事务管理方式为BMT对吗?

BMT和CMT基本都是针对service/ejb而言的,事务管理一般也都在Service层/ejb上控制,Action/jsp/servlet等前段程序无所谓BMT/CMT,如果需要跨多个service/ejb,就需要使用UserTransaction。此时,被调用的ejb(如你所说sessionbean1/sessionbean2)/service仍然属于CMT。

问题二:
如果通过spring将UserTransaction注入到action中,配置文件如何写?

<bean id="transactionManager" class="...TransactionManagerImpl" />
<bean id="userTransaction" class="...UserTransactionImpl" />
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="userTransaction" />
<property name="transactionManager" ref="transactionManager" />
</bean>
<tx:annotation-driven transaction-manager="jtaTransactionManager" />

类似如上这样,然后通过ApplicationContext.getBean("userTransaction")获取即可。

问题三:
如果我不想通过UserTransaction手动控制事务的边界,即我想用CMT,又该如何做?

如果你的操作在ejb/service里的话,是可以的。直接标注一下事务属性为Required,容器就帮你管理事务了。但看你的描述你的操作在Action中,Action里容器是无法管理事务的,如果你希望事务跨两个service/ejb,可以尝试:1)通过UserTransaction;2)将跨两个service/ejb的操作提取出来,放在一个新的ejb/service中。
------解决方案--------------------
说实话,我非常好奇你们的系统框架,怎么又是spring又是ejb的呢?

引用:
Quote: 引用:

问题一:
在action中通过手动获取UserTransaction,sessionbean1和sessionbean2事务管理方式为BMT对吗?

BMT和CMT基本都是针对service/ejb而言的,事务管理一般也都在Service层/ejb上控制,Action/jsp/servlet等前段程序无所谓BMT/CMT,如果需要跨多个service/ejb,就需要使用UserTransaction。此时,被调用的ejb(如你所说sessionbean1/sessionbean2)/service仍然属于CMT。

问题二:
如果通过spring将UserTransaction注入到action中,配置文件如何写?

<bean id="transactionManager" class="...TransactionManagerImpl" />
<bean id="userTransaction" class="...UserTransactionImpl" />
<bean id="jtaTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="userTransaction" />
<property name="transactionManager" ref="transactionManager" />
</bean>
<tx:annotation-driven transaction-manager="jtaTransactionManager" />

类似如上这样,然后通过ApplicationContext.getBean("userTransaction")获取即可。

问题三:
如果我不想通过UserTransaction手动控制事务的边界,即我想用CMT,又该如何做?

如果你的操作在ejb/service里的话,是可以的。直接标注一下事务属性为Required,容器就帮你管理事务了。但看你的描述你的操作在Action中,Action里容器是无法管理事务的,如果你希望事务跨两个service/ejb,可以尝试:1)通过UserTransaction;2)将跨两个ser