2012-04-18 82 views
5

也許一個愚蠢的問題,但如果EntityManager.merge()拋出異常,是否有必要在catch-block中的事務上進行回滾? 或者異常本身是否意味着合併不會工作,以便下一次運行提交時,以前發生的異常將不會應用?是否有必要對catch-block中的事務進行回滾?

例子:

public void setPerson(Person person) { 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MyLib"); 
    EntityManager em = emf.createEntityManager(); 
    try {    
     if(!em.getTransaction().isActive()){ 
      em.getTransaction().begin(); 
     } 
     em.merge(person); 
     em.getTransaction().commit(); 
     emf.getCache().evict(Person.class); // clear Person cache 
    } catch (Exception ex){ 
     em.getTransaction().rollback(); // Is this necessary? 
    } finally { 
     em.close(); 
    } 
} 

回答

4

答案取決於em.merge(person)方法的細節和你的數據庫驅動程序的實現。

如果該方法只執行一個更新語句,那麼rollback是多餘的。但是如果它可能運行多個更新,那麼它就不那麼清楚了。

我個人保持有

如果rollback被刪除,您merge方法錯誤,我們經過一些更新完成,但沒有,那麼其他人關閉數據庫連接沒有明確commitrollback將提交或回滾該事務取決於驅動程序的實現。根據javadoc for java.sql.Connection,行爲取決於實施。因此,如果你自己沒有出錯,你最終可能會提交部分更新。

+0

但是你可以說在catch塊中有回滾沒有傷害嗎?我對嗎? – Rox 2012-04-18 08:20:11

+2

@Rox它不僅沒有傷害,如果你想避免一些不良影響,它可能是必要的。 – 2012-04-18 08:21:20