我遇到了一个奇怪的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创建一个新事务。
但是我不明白为什么当我为EJB1.method1使用默认TransactionAttributeType(通过不指定任何TransactionAttributeType)并且为EJB2.method2使用TransactionAttributeType = REQUIRES_NEW时,容器没有为EJB2.method2创建新事务。
我搜索了与此问题相关的现有问题。但是,我发现的所有情况都是,当您从同一EJB中的另一个私有方法调用私有方法(使用REQUIRES_NEW)时,除非您通过EJB接口调用该容器,否则容器不会启动新事务。这不是我的情况。
最佳答案
伪代码看起来还可以。我已经在各种项目中实践了这一点,所以没有错。
可能有多种原因导致