請幫助我瞭解有關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(我必須知道答案,雖然找到它:))
請爲您的問題提供一個答案,並將其標記爲已解決,以便問題可以正確標記。此外,以下資源可能對您有用: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
感謝您的輸入。我必須再等7個小時才能回答我自己的問題。 – 2012-02-15 09:55:42