EJB TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)没有'

时间:2013-11-12 17:06:32

标签: java java-ee transactions ejb

我遇到了一个奇怪的EJB事务属性问题。 @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)未按预期启动新事务。

我正在使用带有Weblogic的EJB 3。

这是伪代码:

@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接口调用它,否则容器不会启动新事务。这不是我的情况。

1 个答案:

答案 0 :(得分:0)

伪代码看起来不错。我已经在各种项目中实践过这一点,所以没有错。

这可能有多种原因

  • 使用的weblogic版本中的错误,无论是在REQUIRES内部解释transactionattribute还是注入@EJB
  • 使用交易信息api的错误