2012-04-18 6 views
5

Forse una domanda stupida, ma è necessario effettuare un rollback su una transazione nel catch-block se EntityManager.merge() genera un'eccezione? Oppure l'eccezione stessa significa che l'unione non funzionerà in modo che la prossima volta che eseguo il commit le modifiche precedenti che hanno generato l'eccezione non si applicano?È necessario effettuare un rollback su una transazione nel catch-block?

Esempio:

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

risposta

4

La risposta dipende dai dettagli di em.merge(person) metodo e l'implementazione del driver di database.

Se questo metodo esegue solo un'istruzione di aggiornamento, il rollback è superfluo. Se tuttavia può eseguire più aggiornamenti, allora non è chiaro.

Personalmente mi tenerlo lì

Se il rollback viene rimosso e le tue merge errori di metodo nostro, dopo alcuni aggiornamenti sono fatto, ma gli altri non sono, quindi la chiusura di una connessione al database, senza esplicito commit o rollback sarà o commit o rollback la transazione, a seconda dell'implementazione del driver. Secondo lo javadoc for java.sql.Connection, il comportamento dipende dall'implementazione. Quindi si può finire per commettere aggiornamenti parziali se non si è rollback per errore.

+0

Ma allora si potrebbe dire che non fa male avere il rollback nel blocco catch? Ho ragione? – Rox

+2

@Rox Non solo non fa male, potrebbe essere necessario se si desidera evitare alcuni effetti indesiderati. –

Problemi correlati