EJB 3,同一个bean中的事务流

时间:2013-11-18 02:46:24

标签: java ejb-3.1

如果我在EJB bean中有两个方法,一个事务属性为NOT_SUPPORTED,需要用REQUIRED调用另一个方法,如果我通过注入的bean进行调用,我可以期待事务启动:

@Stateless
@LocalBean
public class LeBean {

    @EJB LeBean bean;

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void someMethod(){
        ...
        bean.otherMethod();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void otherMethd(){
        ...
    }
}

或者我可以像这样在本地拨打电话:

@Stateless
@LocalBean
public class LeBean {

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void someMethod(){
        ...
        otherMethod();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void otherMethd(){
        ...
    }
}

现在someMethod()需要很长时间才能在到达otherMethod()之前处理信息,因此事务超时,即使我已将NOT_SUPPORTED声明为第一种方法的transactionAttribute。

1 个答案:

答案 0 :(得分:2)

  如果我通过电话拨打电话,我可以期待交易启动吗?   注入豆:

如果你想要一个交易,你必须通过注入的bean进行调用。必须通过业务接口进行调用,否则将忽略您的事务属性。在您的情况下,如果您从没有交易的方法或暂停的交易(即 - NOT_SUPPORTED)调用otherMethod(),那么它只是一个POJO调用。

从技术上讲,如果确实存在someMethod(),那么otherMethod()将“置于”someMethod()的事务之上。例如,对于someMethod(),你有NOT_SUPPORTED,但如果它是REQUIRED或REQUIRES_NEW,那么otherMethod()将在该事务中共享。 someMethod()的回滚也会从otherMethod()回滚操作。

  

现在someMethod()需要很长时间来处理信息   到达otherMethod(),因此事务超时

这完全是另一个问题。您可能希望增加事务超时,并考虑将其作为单独的异步进程运行。