2012-02-15 103 views
4

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

@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。奇怪的是,当我移动一切,但运行()到一个新的BeanC和调用beanC.process,而不是它的工作。我错过了什么?任何人都可以阐明为什么这种方式的工作方式?

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

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

+0

请为您的问题提供一个答案,并将其标记为已解决,以便问题可以正确标记。此外,以下资源可能对您有用:http://stackoverflow.com/questions/8079142/transactionattribute-requires-new-in-jpa/8079752#8079752 http://piotrnowicki.com/2011/11/am-i -in-the-same-transaction-am-i-using-the-same-persistencecontext/http://stackoverflow.com/a/7218283/920607 – 2012-02-15 09:50:03

+0

感谢您的输入。我必须再等7个小时才能回答我自己的问题。 – 2012-02-15 09:55:42

回答

4

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

在简而言之:容器不会拦截本地方法调用,所以setRollbackOnly标记回滚的唯一事务,解释异常。