0
假設我有一個託管bean,並且我定義了一個EntityManager
。我很想知道事務是如何工作的以及它們在各種不同情況下的表現。從文檔中,我明白flush()
實際上用於覆蓋提交上的延遲並立即執行。所以在下面的示例中,我期待demo
堅持DB和demo2
不是。但它似乎都被視爲單一交易(從我的理解)。這是爲什麼發生?爲什麼不需要begin()
和commit()
的進一步註釋或休眠方法來定義事務的開始和結束?我覺得我在這裏很混亂不同的東西......JTA交易回滾
@Stateless
public class Testing {
@PersistenceContext(unitName = "testDB")
private EntityManager em;
public void doSomeWork(){
Demo demo = new Demo();
em.persist(demo);
em.flush();
//some code that makes it crash
Demo demo2 = new Demo();
em.persist(demo2);
em.flush();
}
}
如何「交易中」規定的?每次方法調用都有單個事務嗎?如果有兩個呼叫彼此無關,第二個呼叫失敗,會怎麼樣呢?第一個也會回滾嗎? – Rakim
它取決於你如何指定它 - 默認情況下,每個方法都具有'Required'事務屬性,這意味着如果存在已存在的事務,則使用它,如果它不存在則創建它。但是,您可以通過使用'javax.ejb.TransactionAttribute'註釋來改變這種情況 - 例如,每次創建一個新的事務時,或者根本不應該使用任何事務。 – rapasoft
我想爲每個單獨的方法調用(來自bean外部的調用)創建一個新的事務。我已經通過鏈接的文檔,但我並不十分熟悉它。默認配置是否足夠? – Rakim