【问题标题】:EJB 3.1 TransactionAttributeType.REQUIRES_NEW and setRollbackOnlyEJB 3.1 TransactionAttributeType.REQUIRES_NEW 和 setRollbackOnly
【发布时间】:2012-03-06 15:07:43
【问题描述】:

请帮助我了解有关 EJB 3.1 中事务的一些信息。我正在使用 GlassFish v3 并且有以下情况:

@Stateless
@LocalBean
public class BeanA {

    @Inject BeanB bean; /* which has no TransactionAttribute set */
    @Resource SessionContext context;

    public void run() {
        ...
        for (...) {
            process(someValue);
        }
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void process(String someValue) {

        try {

            SomeEntity entity = bean.getEntity(someValue);
            entity.setSomeProperty("anotherValue");

            ...

        } catch(CustomException e)  {
            this.context.setRollbackOnly();
        }
    }

}

BeanA.run 是从 servlet 调用的。我想将每次迭代视为单独的事务。我认为使用 TransactionAttributeType.REQUIRES_NEW 会实现这一点,但是在调用 setRollbackOnly 之后,我在 beanB 的后续迭代中得到了 javax.ejb.EJBTransactionRolledbackException。奇怪的是,当我将除 run() 之外的所有内容移动到新的 BeanC 并调用 beanC.process 时,它确实可以工作。我错过了什么?任何人都可以解释一下为什么会这样吗?

编辑:想一想:是不是因为容器没有拦截对同一个 EJB 中方法的调用? (这似乎是合理的)

编辑 2:是的,在这里找到了答案:EJB Transactions in local method-calls(我必须知道答案才能找到它:))

【问题讨论】:

标签: transactions glassfish ejb


【解决方案1】:

在这里找到答案:EJB Transactions in local method-calls

简而言之:容器不拦截本地方法调用,因此 setRollbackOnly 将唯一事务标记为回滚,解释异常情况。

【讨论】:

    【解决方案2】:

    老问题,但为了完整起见......

    确实,像@TransactionAttribute 这样的注解在类中直接调用时不会被处理。发生这种情况是因为您直接调用它,就像在程序函数中一样。它不经历 EJB 生命周期(包括拦截器)。

    虽然有办法做到这一点。您需要注入 self 类并使用该引用:

    // Bean A
    
    @Resource SessionContext context;
    
    public void run() {
        ...
        for (...) {
           context.getBusinessObject(BeanA.class).process(someValue);
        }
    }
    

    通过这种方式,它将创建进程@TransactionAttribute
    虽然它有效,但我不确定这是否是一个好的设计。

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 2014-07-25
      相关资源
      最近更新 更多