¿Qué es @Transactional en Spring Boot y cómo funciona?

| Última modificación: 15 de octubre de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

La gestión de transacciones es fundamental si lo que quieres es garantizar que todas las operaciones de bases de datos se realicen correctamente y de manera segura. Por eso, @Transactional en Spring Boot ha llegado para simplificarte el manejo de estas transacciones en tus aplicaciones Java. Explora qué es y cómo funciona esta anotación en este post.

qué es @transactional en Spring Boot

¿Qué es @Transactional en Spring Boot?

La anotación @Transactional en Spring Boot es la encargada de gestionar las transacciones automáticamente en las aplicaciones que trabajan con bases de datos. Una transacción es un conjunto de operaciones que deben ejecutarse todas juntas o no ejecutarse en absoluto. Es decir, si algo falla en el proceso, todo se revierte para asegurarnos de que los datos no queden en un estado inconsistente.

Lo bueno de @Transactional es que Spring se encarga de todo esto por ti. Así, puedes concentrarte en la lógica de tu negocio sin tener que preocuparte por los detalles técnicos de cómo manejar las transacciones

¿Cómo funciona @Transactional en Spring Boot?

Cuando anotas un método con @Transactional en Spring Boot, Spring se encarga de todo el proceso de transacción de forma automática. Abre la transacción justo antes de que empiece a ejecutarse el método y la cierra cuando este termina. Si todo va bien, la transacción se confirma (es lo que se llama commit) y los cambios se guardan en la base de datos. Pero si algo falla durante la ejecución, Spring revierte todo (rollback) para asegurarse de que los datos no queden mal.

Lo mejor de todo es que no necesitas escribir código extra para gestionar las transacciones. Sin embargo, @Transactional te permite personalizar algunos aspectos, dependiendo de lo que necesites para tu aplicación.

Configuraciones comunes de @Transactional en Spring Boot

La anotación @Transactional en Spring Boot tiene varias opciones con las que puedes controlar el comportamiento de las transacciones. Estas son las más útiles:

readOnly = true

Cuando usas @Transactional(readOnly=true), le dices a Spring que la transacción no realizará cambios en los datos, solo hará lecturas. Esto te sirve si quieres hacer consultas a la base de datos sin necesidad de que Spring mantenga el estado de los objetos. Con esta opción, optimizas el rendimiento de tus consultas.

Ejemplo:

@Transactional(readOnly=true)
public List<Cliente> obtenerTodosLosClientes() {
return clienteRepository.findAll();
}

rollbackFor = Exception.class

Con esta configuración especificas qué tipos de excepciones deben causar un rollback (reversión) de la transacción. Por defecto, Spring solo hace rollback en excepciones que extienden RuntimeException, pero con rollbackFor, puedes definir excepciones específicas.

Ejemplo:

@Transactional(rollbackFor = Exception.class)
public void procesarPedido(Pedido pedido) throws Exception {
// Lógica de procesamiento del pedido
if (pedido.invalido()) {
throw new Exception("Pedido inválido");
}
}

propagation = Propagation.REQUIRED

Esta opción controla cómo se comporta la transacción si ya existe una activa. El valor predeterminado es Propagation.REQUIRED, lo que significa que si ya hay una transacción activa, el método se unirá a ella. Si no hay una transacción en curso, Spring creará una nueva.

Ejemplo:

@Transactional(propagation = Propagation.REQUIRED)
public void actualizarInventario(Producto producto) {
// Lógica para actualizar inventario
}

isolation = Isolation.READ_COMMITTED

El nivel de aislamiento de una transacción controla cómo se manejan las operaciones concurrentes en la base de datos. READ_COMMITTED asegura que una transacción solo puede leer datos que han sido confirmados por otras transacciones.

Ejemplo:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void procesarCompra(Compra compra) {
// Lógica para procesar una compra
}

@Transactional en Spring Boot: Ejemplo práctico

Imagina que vas a desarrollar una aplicación para una tienda online y necesitas un método que procese el pedido de un cliente. Quieres que este proceso sea transaccional, de modo que si algo falla (por ejemplo, el pago no se completa), se revierta todo y los datos queden en un estado consistente.

@Service
public class PedidoService {

@Autowired
private PedidoRepository pedidoRepository;

@Autowired
private PagoService pagoService;

@Transactional
public void procesarPedido(Pedido pedido) {
// Guardar el pedido en la base de datos
pedidoRepository.save(pedido);

// Realizar el pago del pedido
pagoService.realizarPago(pedido);

// Si algo falla en realizarPago, todo se revierte
}
}

Como ves, el método procesarPedido está anotado con @Transactional, lo que significa que si algo falla durante la ejecución del método, como un error en el servicio de pago, Spring revertirá todos los cambios, incluyendo la inserción del pedido en la base de datos.

Con la anotación @Transactional en Spring Boot logras gestionar las transacciones de forma automática, optimizando el rendimiento de tus aplicaciones y asegurando que los datos se mantengan siempre consistentes.

Domina Spring Boot y aprende a manejar transacciones con el Bootcamp de Java Full Stack de KeepCoding. En este bootcamp, aprenderás a construir aplicaciones escalables y a implementar soluciones que realmente transformarán tu carrera. El sector tecnológico está en constante crecimiento, ofreciendo salarios altos y estabilidad laboral. ¡Inscríbete hoy y da el paso hacia una carrera con futuro!

Ramón Maldonado

Full Stack Developer y Responsable de Formación base en KeepCoding.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Java y Spring Boot

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado