2012-04-18 12 views
5

Może to głupie pytanie, ale czy konieczne jest wycofanie transakcji w bloku catch, jeśli EntityManager.merge() zgłasza wyjątek? A może sam wyjątek oznacza, że ​​scalanie nie zadziała, aby następnym razem uruchomić, zatwierdzić poprzednie zmiany, które spowodowały wyjątek, który nie będzie stosowany?Czy konieczne jest wycofanie transakcji w bloku catch?

Przykład:

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

Odpowiedz

4

Odpowiedź zależy od szczegółów em.merge(person) metody i wdrożenie sterownika bazy danych.

Jeśli ta metoda wykonuje tylko jedną aktualizację, oznacza to, że numer rollback jest zbędny. Jeśli jednak może uruchomić wiele aktualizacji, nie jest to takie jasne.

Osobiście go trzymać tam

Jeśli rollback jest usuwany i twoi merge błędy metoda nasz po niektóre aktualizacje są wykonywane, ale inni nie, a następnie zamknięcie połączenia z bazą danych bez wyraźnej commit lub rollback będzie albo zatwierdzenia lub wycofania transakcja, w zależności od implementacji sterownika. Zgodnie z javadoc for java.sql.Connection, zachowanie zależy od implementacji. W związku z tym możesz skończyć się częściowymi aktualizacjami, jeśli sam nie popełnisz błędu.

+0

Ale czy można powiedzieć, że nie zaszkodzi mieć wycofanie w bloku catch? Czy mam rację? – Rox

+2

@Rox Nie tylko nie boli, może być konieczne, jeśli chcesz uniknąć niepożądanych efektów. –

Powiązane problemy