想象一下以下两个ejb3.0无状态会话bean,每个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重用?
干杯!
答案 0 :(得分:2)
这取决于您的事务属性 - 您可以使用@TransactionAttribute注释将其设置为以下之一:
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 :(得分:1)
这取决于您如何为每种方法定义事务策略。
如果它在方法B和A中是必需的:它将对两个使用相同的事务
如果它是A的必需项并且B需要新的:它将为方法B创建新的事务