2012-04-18 18 views
5

Quizás una pregunta estúpida, pero ¿es necesario realizar una reversión de una transacción en el catch-block si EntityManager.merge() arroja una excepción? ¿O la propia excepción significa que la fusión no funcionará para que la próxima vez que ejecute los cambios previos que arrojó la excepción no se aplique?¿Es necesario realizar una reversión de una transacción en el bloque catch?

Ejemplo:

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

Respuesta

4

La respuesta depende de los detalles de em.merge(person) método y la implementación del controlador de base de datos.

Si ese método solo realiza una declaración de actualización, entonces el rollback es superfluo. Sin embargo, si puede ejecutar múltiples actualizaciones, entonces no es tan claro.

yo personalmente mantenerlo allí

si se retira la rollback y sus merge errores de método nuestra después de algunos cambios se hacen, pero otros no lo son, a continuación, el cierre de una conexión de base de datos sin explícita commit o rollback se confirma o retrotrae la transacción, dependiendo de la implementación del controlador. De acuerdo con javadoc for java.sql.Connection, el comportamiento depende de la implementación. Por lo tanto, puede terminar comprometiendo actualizaciones parciales si no se pone rollback usted mismo por error.

+0

Pero entonces ¿podría decir que no le hace daño tener la reversión en el bloque catch? ¿Estoy en lo cierto? – Rox

+2

@Rox No solo no duele, puede ser necesario si desea evitar algunos efectos no deseados. –

Cuestiones relacionadas