Sobes.tech
Junior — Middle

¿Cómo se comporta el sistema si dentro de un método marcado como transaccional se llama a otro método también marcado con la anotación transaccional?

sobes.tech AI

Respuesta de la IA

En Java, al usar transacciones (por ejemplo, con la anotación @Transactional en Spring), si dentro de un método transaccional se llama a otro método también marcado como transaccional, el comportamiento depende del tipo de proxy y de la configuración de las transacciones.

Por defecto, si la llamada se realiza dentro de la misma clase (llamada interna al método), el proxy no intercepta esa llamada y no se crea una nueva transacción; se usa la transacción actual (si existe).

Si la llamada se realiza desde fuera (a través del proxy), entonces:

  • Con propagation de tipo REQUIRED (por defecto), no se crea una transacción interna, se usa la existente.
  • Con propagation REQUIRES_NEW, se crea una nueva transacción, suspendiendo la actual.

De esta forma, al llamar a un método transaccional desde otro método transaccional en la misma clase, generalmente se usa la misma transacción, y la anotación anidada no crea una nueva transacción.

Si se desea que el método interno se ejecute en una transacción separada, la llamada debe realizarse a través del proxy (por ejemplo, mediante otro bean o mediante auto-inyección).