EJB 3.0事务边界从另一个调用一个本地EJB

时间:2010-08-31 14:24:41

标签: transactions java-ee ejb-3.0

想象一下以下两个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重用?

干杯!

2 个答案:

答案 0 :(得分:2)

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

  • 必需
  • REQUIRES_NEW
  • SUPPORTS
  • 强制性
  • 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 :(得分:1)

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

如果它在方法B和A中是必需的:它将对两个使用相同的事务

如果它是A的必需项并且B需要新的:它将为方法B创建新的事务