我可以在同一EJB中使用TransactionAttributeType.NOT_SUPPORTED从另一个方法调用TransactionAttributeType.REQUIRED的方法吗?

时间:2016-12-21 13:12:50

标签: java ejb-3.1

我有以下代码结构,我需要指导如何从同一EJB中的NOT_SUPPORTED事务类型方法级联启动本地事务。

@Stateless
@TransactionManagement(value = TransactionManagementType.CONTAINER)
public class SessionBean implements SessionBeanInterface{
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void methodA() {
        methodB();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void methodB() {

    }

}

目前,当我尝试这个时,我得到以下异常。

  

PuId没有活动事务= App#EJB.jar #Persistence

2 个答案:

答案 0 :(得分:2)

你打电话的方式"方法B"不会让EJB容器为您启动事务上下文。为此,您必须通过远程或本地视图/接口调用该方法。

容器为您提供这些附加功能,因此有必要通过接口路由您的呼叫。 (另一方面,这是代理设计模式)。

如果你直接打电话"方法B"正如您在上面的代码片段中所做的那样,它只是另一个没有容器干预的方法调用。

答案 1 :(得分:0)

事务属性类型NOT_SUPPORTED仅表示此方法不支持任何事务。如果在调用该方法时有一个,它将是suspendend。

因此,在每种情况下,对methodB的调用都不会有任何交易。事务属性类型REQUIRED现在抛出异常,因为......好吧......因为事务是必需的,但不会被创建。

因此,在这种情况下,您可以使用methodB上的REQUIRES_NEW类型,现在始终以新的新交易开始,无论之前是否存在(将暂停)。