Tengo un método de servicio administrado por Spring para administrar las inserciones de la base de datos. Contiene múltiples instrucciones de inserción.por qué la transacción se retrotrae a RuntimeException pero no a SQLException
@Transactional
public void insertObservation(ObservationWithData ob) throws SQLException
{
observationDao.insertObservation(ob.getObservation());
// aop pointcut inserted here in unit test
dataDao.insertData(ob.getData());
}
Tengo dos pruebas de unidad que arrojan una excepción antes de llamar al segundo inserto. Si la excepción es una RuntimeException, la transacción se revierte. Si la excepción es una SQLException, la primera inserción se conserva.
Estoy desconcertado. ¿Alguien puede decirme por qué la transacción no retrocede en una SQLException? ¿Alguien puede ofrecer una sugerencia sobre cómo manejar esto? Pude captar la SQLException y lanzar una RuntimeException, pero eso parece extraño.
Según la respuesta de skaffman y la sugerencia de Nathan, capturé todas las SQLExceptions en la capa DAO y utilicé SQLExceptionTranslator de Spring para traducirlas a DataAccessExceptions sin marcar. Esta publicación del foro de primavera, http://forum.springsource.org/showthread.php?63549-Conceptual-context-information, y el capítulo Manejo de errores de Robert Martin en "Código limpio. Un manual de software ágil para la artesanía" (Prentice Hall, 2008) también fueron útiles para aclarar por qué arrojar la excepción sin marcar mantiene una modularidad más agradable. – climmunk