EJB TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 不'

use*_*046 5 java ejb transactions jakarta-ee

我遇到了一个奇怪的 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();
   }
}
Run Code Online (Sandbox Code Playgroud)

由于我为 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样它就强制容器为 EJB2.method2 创建一个新事务。

但我不明白为什么当我为 EJB1.method1 设置了默认 TransactionAttributeType(通过不指定任何 TransactionAttributeType)并且为 EJB2.method2 设置了 TransactionAttributeType=REQUIRES_NEW 时,容器没有为 EJB2.method2 创建新事务。

我搜索了与这个问题相关的现有问题。但我发现的情况是,当您从同一 EJB 中的另一个私有方法调用私有方法(使用 REQUIRES_NEW)时,容器不会启动新事务,除非您通过 EJB 接口调用它。这不是我的情况。

asc*_*erk 0

伪代码看起来没问题。这是我在不同项目中实践过的,所以没有什么问题。

造成这种情况的原因可能有多种

  • 使用的 weblogic 版本中的错误要么在 REQUIRES 内的 transactionattribute 的解释中,要么在注入 @EJB 时
  • 交易信息 API 使用中的错误