我有以下代码结构,我需要指导如何从同一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
答案 0 :(得分:2)
你打电话的方式"方法B"不会让EJB容器为您启动事务上下文。为此,您必须通过远程或本地视图/接口调用该方法。
容器为您提供这些附加功能,因此有必要通过接口路由您的呼叫。 (另一方面,这是代理设计模式)。
如果你直接打电话"方法B"正如您在上面的代码片段中所做的那样,它只是另一个没有容器干预的方法调用。
答案 1 :(得分:0)
事务属性类型NOT_SUPPORTED
仅表示此方法不支持任何事务。如果在调用该方法时有一个,它将是suspendend。
因此,在每种情况下,对methodB
的调用都不会有任何交易。事务属性类型REQUIRED
现在抛出异常,因为......好吧......因为事务是必需的,但不会被创建。
因此,在这种情况下,您可以使用methodB
上的REQUIRES_NEW
类型,现在始终以新的新交易开始,无论之前是否存在(将暂停)。