2016-05-03 169 views
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(); 
    } 
} 

回答

1

當使用Container managed transactions所有會話bean是由事務中的默認運行。這意味着,如果發生導致事務回滾的異常,則對demo的更改也會回滾。

下面是關於如何flush()作品一些有用的信息:https://en.wikibooks.org/wiki/Java_Persistence/Persisting#Flush

+0

如何「交易中」規定的?每次方法調用都有單個事務嗎?如果有兩個呼叫彼此無關,第二個呼叫失敗,會怎麼樣呢?第一個也會回滾嗎? – Rakim

+0

它取決於你如何指定它 - 默認情況下,每個方法都具有'Required'事務屬性,這意味着如果存在已存在的事務,則使用它,如果它不存在則創建它。但是,您可以通過使用'javax.ejb.TransactionAttribute'註釋來改變這種情況 - 例如,每次創建一個新的事務時,或者根本不應該使用任何事務。 – rapasoft

+0

我想爲每個單獨的方法調用(來自bean外部的調用)創建一個新的事務。我已經通過鏈接的文檔,但我並不十分熟悉它。默認配置是否足夠? – Rakim