Gestor de transacciones en Spring usando anotaciones

Una de las maneras más cómodas y efectivas de usar el gestor de transacciones desde una aplicación que usa Spring es mediante el uso de anotaciones.

Para ello se pueden seguir los siguientes pasos, teniendo en cuenta que ésta no es la única solución para implementar este mecanismo:

1. Declarar el gestor de transacciones a usar en el fichero de configuracion del contexto (applicationContext.xml):

2. Indicar en el mismo fichero que se usarán anotaciones:

3. Usar las anotaciones. Una práctica habitual es considerar ‘transaccional‘ cualquier operación a nivel de servicio. De esta manera nos aseguramos que un posible fallo en una operación atómica de acceso a BBDD cause el ‘rollback’ de la operación completa dentro de la que se estuviera ejecutando dicha operación:

La anotación @Transactional puede recibir varios argumentos. Estos argumentos se usan para controlar las características de la transacción, como el grado de propagación o las características de los datos a los que afecta. Una aplicación del uso de estos argumentos es la implementación de un método que pueda realizar una operación aunque la transacción presente finalice de forma abrupta. Esto es útil para modificar ciertos datos ante una excepción.

En este caso, aunque la transacción presente finalice, se puede invocar al método anterior para que, dentro de una nueva transacción (propagation = Propagation.REQUIRES_NEW) y usando sólo datos que no hayan sido previamente alterados (isolation = Isolation.READ_COMMITTED), ejecute su contenido, por ejemplo, para evitar que ciertos datos queden en un estado inconsistente.

Es importante tener en cuenta que todos estos métodos han de ser invocados desde fuera de la clase a los que pertenecen, para que se apliquen los criterios definidos para las transacciones. Si se invoca el método anterior desde dentro de la clase que lo implementa, no se aplicará la creación de una nueva transacción, por ejemplo.