¿Qué hace @Transactional?
Opciones
- Hace que el método sea más rápido guardando resultados en caché
- Envuelve el método en una transacción: commit o rollback (Opción correcta)
- Hace que el método se ejecute de forma asíncrona en otro thread
- Cifra los datos que el método lee y escribe
Respuesta
Envuelve el método en una transacción de base de datos: commit si termina, rollback si se escapa una RuntimeException (o un Error)
Por qué
Una transacción agrupa varias operaciones de base de datos para que todas funcionen o todas fallen (ACID). @Transactional lo hace de forma declarativa: Spring inicia una transacción antes del método y hace commit después.
Regla de rollback por defecto: solo para excepciones unchecked (RuntimeException, Error). Una excepción checked NO hace rollback salvo que escribas @Transactional(rollbackFor = Exception.class).
Ponla en los métodos de servicio (la unidad de trabajo), no en controladores ni repositorios.
@Transactional
public void transfer(Long from, Long to, BigDecimal amount) {
accounts.withdraw(from, amount);
accounts.deposit(to, amount); // if this throws, the withdraw is undone
}Recuerda
@Transactional: commit si va bien, rollback con RuntimeException por defecto.