在交易中打开新交易时提交

时间:2011-06-14 11:28:39

标签: java java-ee transactions ejb-3.0 weblogic11g

使用Ejb3.0,Weblogic 11g,JDBC

我正在调用一个在另一个部署EAR中远程运行的方法。

正在调用远程部署中的方法,但是使用了该方法对其进行了注释 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

问题是,在调用远程方法之前,我在数据库中执行的所有逻辑都不会提交,直到远程方法完成。

我愿意做的是承诺让“之前”逻辑发生“并且当我在远程呼叫之后回来继续正常时。

有什么想法吗?

解释一些代码:

@CallByReference
@Stateless(mappedName = "ejb/OperatorProccessBean")
@Local({ OperatorProccessBeanLocal.class })
@Remote({ OperatorProccessBeanRemote.class })
public class OperatorProccessBean implements OperatorProccessBeanLocal,  
 OperatorProccessBeanRemote
{   

...

   SBNDispatchBeanRemote SBNDispatchBean = (SBNDispatchBeanRemote) context.lookup("ejb/SBNDispatchBean#com.mirs.sbn.dispatch.SBNDispatchBeanRemote");
    if (SBNDispatchBean == null)
    {
            logger.error(TAG + " SBNDispatchBean is null");

    }
    else
    {
         //until here I want all my data to be commited without waiting for the upcoming remote method to finish
         SBNDispatchBean.updateSubscriberInBlockingList(...);
    }
...
 }

现在方法updateSubscriberInBlockingList()注释为

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)

我希望在调用该方法之前提交数据。

提前致谢, 射线。

2 个答案:

答案 0 :(得分:2)

  

现在使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)注释方法updateSubscriberInBlockingList()

     

我希望在调用该方法之前提交数据。

鉴于您正在使用容器管理的事务,因此无法实现。这背后的基本原理是,当容器已经在执行事务时,启动新事务将导致原始事务被暂停。新事务提交后,原始事务将恢复。

此行为是不可配置的,因为EJB容器和JTA事务管理器应符合JTA规范中指定的行为,该行为源自X / Open DTP事务模型。在X / Open DTP模型中,如果启动了新事务,而另一个事务正在进行中,则当前事务将暂停,并在稍后的时间点恢复。应该注意的是,没有交易模型,可能(我没有全部研究过)允许提交当前交易并开始新交易。我只看到各种事务处理模型支持嵌套事务或挂起事务。

如果要提交工作,则必须完全终止现有事务上下文,以便现有事务提交,然后启动新事务。

答案 1 :(得分:1)

将“远程调用之前”逻辑放在另外用REQUIRES_NEW注释的bean方法中。因此,您将有三笔交易:

  • 一个用于main方法(但在完成远程调用之前不会执行任何操作);
  • 一个用于远程呼叫之前的逻辑;
  • 一个用于远程呼叫。
相关问题