2012-04-18 4 views
5

Vielleicht eine dumme Frage, aber ist es notwendig, einen Rollback auf eine Transaktion im Catch-Block zu machen, wenn die EntityManager.merge() eine Ausnahme auslöst? Oder bedeutet die Ausnahme selbst, dass die Zusammenführung nicht funktioniert, so dass beim nächsten Ausführen von commit die vorherigen Änderungen, die die Ausnahme ausgelöst haben, nicht zutreffen?Muss ein Rollback für eine Transaktion im Catch-Block durchgeführt werden?

Beispiel:

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(); 
    } 
} 

Antwort

4

Die Antwort hängt von den Einzelheiten der em.merge(person) Methode und die Umsetzung Ihrer Datenbanktreiber. Wenn diese Methode nur eine Aktualisierungsanweisung ausführt, ist rollback überflüssig. Wenn es jedoch mehrere Updates ausführen kann, ist es nicht so klar.

Ich persönlich würde es dort halten

Wenn die rollback entfernt und Ihre merge Methode Fehler unserer nach einigen Updates fertig sind, aber andere nicht sind, dann eine Datenbankverbindung ohne explizite commit oder rollback wird entweder Commit oder Rollback Schließen die Transaktion, abhängig von der Treiberimplementierung. Laut der javadoc for java.sql.Connection hängt das Verhalten von der Implementierung ab. Daher können Sie am Ende partielle Aktualisierungen vornehmen, wenn Sie sich nicht selbst in Fehler rollback befinden.

+0

Aber dann könnte man sagen, dass es nicht schadet, das Rollback im Catch-Block zu haben? Habe ich recht? – Rox

+2

@Rox Es tut nicht nur nicht weh, es kann notwendig sein, wenn Sie einige unerwünschte Effekte vermeiden wollen. –