Transactions CMT的JTA事务划分具体在哪里?

Transactions CMT的JTA事务划分具体在哪里?,transactions,glassfish,ejb-3.0,jta,Transactions,Glassfish,Ejb 3.0,Jta,我试图完全理解JTA与CMT之间的界限。我所经历的行为是,EJB上只尊重该方法的第一个@TransactionaAttribute,而使用不同@TransactionaAttribute注释的同一bean的后续方法调用则不受尊重 例如: @Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public class Foo implements IFoo { @EJB private IBa

我试图完全理解JTA与CMT之间的界限。我所经历的行为是,EJB上只尊重该方法的第一个@TransactionaAttribute,而使用不同@TransactionaAttribute注释的同一bean的后续方法调用则不受尊重

例如:

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class Foo implements IFoo {

   @EJB
   private IBar barBean;

   // inherits class transaction annotation of NOT_SUPPORTED
   public void doSomething() {
        barBean.doAction();
   }
}

@Stateless
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class Bar implements IBar {

    public void doAction() {
        Entity entity = bar.find();
        entity.setName("new name");
        // fails with EJBException with TransactionRequiredException as cause
        save(entity);
    }

    public Entity find() {
        // return some persisted entity.
        return em.findById(1);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public Entity save(entity) {
        em.persist(em.merge(entity));
        em.flush();
    }
}
我看到的行为是Bar.save()抛出TransactionRequiredException。因此,这告诉我save()上所需的注释集不会创建事务。需要新的也不起作用。如果我将save()移动到另一个EJB,它将按预期工作

这是否意味着,无论使用不同的注释值对同一对象进行后续方法调用,都只考虑第一个TransactionAttribute注释?这是一个bug还是预期的行为?我似乎找不到任何具体解释这一点的文件。我很感激对这方面的任何见解

我的堆栈: EJB3.0, Toplink Essentials,
GF V2UR2

我对EJB3规范的理解是,单个方法上的事务规范覆盖了整个EJB的事务规范。因此,您的期望应该适用似乎是合理的,但

只有当您将bean方法作为EJB使用时,才可以这样做。当您从一个业务方法doAction()直接调用另一个save()时,您没有使用EJB引用,因此这只是简单的旧Java—不涉及容器,因此容器没有介入的机会

如果将所需选项应用于doAction()方法,我希望它能正常工作


这个理论与您关于重构到另一个EJB的效果的发现是一致的。

djna-谢谢您的回答。你的解释有道理。我与另一位同事取得了联系,他也同意你的说法。谢谢你抽出时间。