2012-10-11 104 views

Respuesta

10

No es necesario incluir RuntimeException en la lista rollbackFor. Manejará eso incluso si no lo mencionas.

Lo he intentado por JdbcTemplate: -

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = MyException.class) 
public void updateSalary(final int increment){ 
    jdbcTemplate.update("update EMPLOYEE set emp_salary = emp_salary + ?", increment); 
    throw new RuntimeException("update exception"); 
} 
 
Output: 
After Insertion: 
1 Deepak 35000 
2 Yogesh 35000 
3 Aditya 35000 

update exception 
After Update 
1 Deepak 35000 
2 Yogesh 35000 
3 Aditya 35000 
+0

¿No será nunca cometer todos modos porque solo has leído = verdad? –

+0

@AlexBeardsley thnx para señalar el error ... modifiqué la respuesta. Volví a ejecutar el código ... y sí, no es necesario incluir la excepción de tiempo de ejecución en la lista de reversión. – deepakraut

5

Sin embargo, tenga en cuenta que la transacción código de la infraestructura de la Spring Framework, por defecto, sólo se marca una transacción para reversión en el caso del tiempo de ejecución, excepciones sin marcar; es decir, cuando la excepción lanzada es una instancia o subclase de RuntimeException. (Los errores también provocarán, de manera predeterminada, una reversión). Las excepciones marcadas que se lanzaron desde un método transaccional no darán como resultado en la transacción que se está retrotrayendo.

Source

Esto podría ayudar: Spring transaction management with checked and unchecked exception

0

por lo que puede hacer retroceder con CheckedException así (RuntimeException por defecto), ejemplo:

@Transactional(rollbackFor = Exception.class) 
public void save(Book book) throws Exception { 
    bookRepository.save(book); 
    System.out.println("Saved in transcation."); 
    // No data is persisted 
    if (true) { 
     throw new Exception(); 
    } 
} 
Cuestiones relacionadas