Repaso
English
Spring, JPA y Java WebIntermedioSPR-14

¿Qué hace @Transactional?

Opciones

  1. Hace que el método sea más rápido guardando resultados en caché
  2. Envuelve el método en una transacción: commit o rollback (Opción correcta)
  3. Hace que el método se ejecute de forma asíncrona en otro thread
  4. 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.

Términos clave

Practica esta pregunta en Repaso