2012-02-15 62 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標記回滾的唯一事務,解釋異常。