我遇到了一个奇怪的 EJB 事务属性问题。@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 没有按预期启动新事务。
我正在将 EJB 3 与 Weblogic 一起使用。
这是伪代码:
@Stateless
public class EJB1 implements IEJB1
{
@EJB
private IEJB2 ejb2;
@Override
public void method1()
{
for (i=0; i<N; i++) {
ejb2.method2();
}
}
}
@Stateless
public class EJB2 implements IEJB2
{
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void method2()
{
DBpersist();
}
}
由于我为 EJB2.method2 指定了 TransactionAttributeType.REQUIRES_NEW,我希望为 methood2 创建一个新事务。但是在测试过程中我发现没有为method2创建新的事务,而是method2与EJB1.method1有相同的事务。我使用 Weblogic 的 API 来记录交易信息。
然后我做了以下代码更改:
@Override
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED
public void method1()
{
for (i=0; i<N; i++) {
ejb2.method2();
}
}
通过这种方式,它强制容器为 EJB2.method2 创建一个新事务。
但是我不明白为什么容器没有为 EJB2.method2 创建新事务,因为我有 EJB1.method1 的默认 TransactionAttributeType(通过不指定任何 TransactionAttributeType)和 EJB2.method2 的 TransactionAttributeType=REQUIRES_NEW。
我搜索了与此问题相关的现有问题。但我发现的只是当您从同一个 EJB 中的另一个私有方法调用私有方法(使用 REQUIRES_NEW)时,容器不会启动新事务,除非您通过 EJB 接口调用它。这不是我的情况。