EJB 3.0中,一个本地EJB调用另一个本地EJB的事务边界处理

3

想象一下以下两个ejb3.0无状态会话bean,每个都实现了一个本地接口,并且它们部署在同一个容器中:

public class EjbA {
    @EJB 
    private ejbB;

    public void methodA() {
        for (int i=0; i<100; i++) {
            ejbB.methodB();
        }
    }    
}

public class EjbB {
    public void methodB() {
        ...
    }
}

当调用methodA时,每次调用methodB是否会导致新的事务开始和提交?或者,由于这些都是本地bean,当调用methodA时是否会开始一个事务并被methodB重复使用?祝好!
2个回答

2

这取决于您的事务属性 - 您可以使用@TransactionAttribute注释将其设置为以下之一:

  • REQUIRED
  • REQUIRES_NEW
  • SUPPORTS
  • MANDATORY
  • NOT_SUPPORTED
  • NEVER

REQUIRED是默认值,如果没有正在进行的事务,则会启动一个新事务,否则容器将使用现有的事务。

REQUIRES_NEW告诉容器始终启动新事务。

在我看来,其他选项很少使用 - 但它们都在EJB规范中定义。

例如:

@Stateless
public class EjbA {
    @EJB 
    private ejbB;

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void methodA() {
        for (int i=0; i<100; i++) {
            ejbB.methodB();
        }
    }    
}

...会使methodA()始终在一个新的事务中运行。


1

这取决于您为每种方法定义事务策略的方式。

如果在方法B和A中都需要,则会对两者使用相同的事务。

如果对A是必需的,而对B是Requires New,则会为方法B创建新的事务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接