【问题标题】:EJB TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) doesn'EJB TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 没有
【发布时间】:2013-11-24 23:19:27
【问题描述】:

我遇到了一个奇怪的 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 接口调用它。这不是我的情况。

【问题讨论】:

  • 你能提供一个SSCCE吗?
  • 你好Michael,你的意思是提供可以编译的示例代码?
  • 接口是用@Local @Remote注解的吗?
  • 嗨 Gabriel,它们用@Remote 注释
  • 作为 NOT_SUPPORTED “帮助”实际强制创建新事务也意味着实际上已经有一个正在运行的事务(可能由 EJB 客户端创建)。你确定你没有不小心测量这个一直使用的吗?

标签: java jakarta-ee transactions ejb


【解决方案1】:

伪代码看起来没问题。这是我在各种项目中实践过的,所以没有错。

这可能有多种原因

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-07
    • 2012-07-21
    • 2016-11-18
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多