2012-04-18 6 views
5

愚かな質問かもしれませんが、EntityManager.merge()が例外をスローするとcatchブロック内のトランザクションをロールバックする必要がありますか? または、例外自体がマージがうまくいかないことを意味するので、次に例外がスローされた前回の変更をコミットするときに適用されません。catchブロック内のトランザクションに対してロールバックを行う必要はありますか?

例:

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)方法の詳細、およびデータベースドライバの実装に依存します。

この方法では1つの更新ステートメントのみが実行される場合、rollbackは不必要です。しかし、複数の更新を実行する可能性がある場合は、明らかではありません。

私は個人的にrollbackが削除される場合があり

をそれを維持してしまうあなたmerge方法の誤り、当社の一部の更新が行われますが、他にはない、明示的なcommitrollbackコミットするかまたはロールバックせずにデータベース接続をクローズした後にトランザクションは、ドライバの実装に依存します。 javadoc for java.sql.Connectionによれば、動作は実装によって異なります。したがって、rollbackあなた自身が間違っていないと、部分的な更新をコミットすることになるかもしれません。

+0

しかし、キャッチブロックにロールバックされていても痛いとは言えません。私は正しい? – Rox

+2

@Roxそれは傷つけないだけでなく、望ましくない影響を避けたい場合には必要かもしれません。 –

関連する問題