referencia a Spring documentation:Mejores prácticas para hacer retroceder las transacciones en la primavera de 3/Hibernate
Cualquier RuntimeException activarán rollback, y cualquier excepción revisada no
referencia a javapractices.com
sin comprobar excepciones:
- representan defectos en el programa (errores) - a menudo argumentos inválidos pasaron a un método no privado. Para cita de la programación en Java Idioma, por Gosling, Arnold, y Holmes: "excepciones de tiempo de ejecución sin comprobar representan condiciones que, en general habla, reflejar errores en la lógica de su programa de y no puede ser razonablemente recuperado de durante la ejecución tiempo "
- son subclases de RuntimeException, y por lo general se implementan usando IllegalArgumentException, NullPointerException, o IllegalStateException
- un método no está obligado a establecer una política para las excepciones sin marcar lanzadas por su aplicación (y casi siempre no lo hacen de modo)
las excepciones comprobadas:
- representan condiciones no válidas en áreas fuera de la estafa inmediata trol de el programa (de entrada no válido de usuario, problemas de bases de datos, las interrupciones de red, archivos ausentes)
- son subclases de Excepción
- un método está obligado a establecer una política para todas las excepciones lanzadas por su aplicación seleccionada (ya sea pasar la excepción comprobada más arriba la pila, o manejar de alguna manera)
Si durante mi lógica de negocio descubro un problema y quiero deshacer los cambios, tengo que lanzar una nueva Run timeException? No es realmente una excepción RuntimeException (excepción no verificada) ya que la identifiqué en la lógica. ¿O tal vez estoy malinterpretando estos conceptos?
Mi pregunta real, ¿cuáles son las mejores prácticas para deshacer una transacción en mis métodos de servicio @Transactional?
¿Cómo puedo devolver algo de mi método si tiro? ¿una excepción? Además, lanzar una excepción es bastante costoso. ¿No hay alguna manera de deshacer manualmente la transacción sin activar una excepción? –
@GuillaumePolet Podría decirse que si está invirtiendo deliberadamente las cosas como parte de un flujo de procesos comerciales no excepcionales, los costos asociados con las reversiones en un RDBMS empequeñecen por órdenes de magnitud cualquier costo real o percibido de una excepción en un entorno moderno JVM, y todo el diseño debería ser revisado. De todos modos, si no te gusta la forma en que funcionan las transacciones declarativas ... no las uses. La característica no es de ninguna manera su única opción. Aún puede usar transacciones simples de sesión de hibernación propias. – Affe