true transaction transacciones requires_new example data annotation java spring spring-transactions transactional

java - transacciones - spring transaction propagation



¿El método @Transactional llamando a otro método sin la anotación @Transactional? (3)

He visto un método en una clase de servicio que estaba marcado como @Transactional , pero también estaba llamando a otros métodos en esa misma clase que no estaban marcados como @Transactional .

¿Significa que la llamada a métodos separados está causando que la aplicación abra conexiones separadas a DB o suspenda la transacción principal, etc.?

¿Cuál es el comportamiento predeterminado para un método sin ninguna anotación que es invocado por otro método con la anotación @Transactional ?


@Transactional marca el límite de la transacción (inicio / finalización) pero la transacción en sí misma está vinculada al hilo. Una vez que se inicia una transacción, se propaga entre las llamadas de método hasta que el método original se devuelve y la transacción se confirma / revierte.

Si se llama a otro método que tiene una @ anotación transaccional, entonces la propagación depende del atributo de propagación de esa anotación.


Cuando llama a un método sin @Transactional dentro de un bloque de transacción, la transacción principal continuará con el nuevo método. Utilizará la misma conexión del método principal (con @Transactional ) y cualquier excepción causada en el método llamado (sin @Transactional causará que la transacción se @Transactional según lo configurado en la definición de la transacción).

Si llama a un método con una anotación @Transactional desde un método con @Transactional dentro de la misma instancia, el comportamiento transaccional de los métodos llamados no tendrá ningún impacto en la transacción. Pero si llama a un método con una definición de transacción de otro método con una definición de transacción, y están en diferentes instancias, entonces el código en el método llamado seguirá las definiciones de transacción dadas en el método llamado.

Puede encontrar más detalles en la sección Gestión de transacciones declarativa de la documentación de transacciones de Spring .

El modelo de transacción declarativa de primavera utiliza el proxy AOP. por lo que el proxy AOP es responsable de la creación de las transacciones. El proxy AOP estará activo solo si los métodos con en la instancia se llaman desde fuera de la instancia.


  • ¿Eso significa que la llamada a métodos separados está causando que la aplicación abra conexiones separadas a la base de datos o suspenda la transacción principal, etc.?

Eso depende de un nivel de propagación . Aquí están todos los values nivel posibles.

Por ejemplo, en caso de que un nivel de propagación sea NESTED una transacción actual se "suspenderá" y se creará una nueva transacción ( nota: la creación real de una transacción anidada solo funcionará en administradores de transacciones específicos )

  • ¿Cuál es el comportamiento predeterminado para un método sin ninguna anotación a la que llama otro método con @Transactional anotación?

Se REQUIRED nivel de propagación predeterminado (lo que usted llama "comportamiento"). En caso de que se @Transactional un método "interno" que tenga una anotación @Transactional (o se @Transactional de manera declarativa mediante XML), se ejecutará dentro de la misma transacción , por ejemplo, se creará "nada nuevo".