Si tengo el siguiente código:

@Component
public class A{ 

@Transactional(propagation = Propagation.REQUIRED)
public void a(){
    //logic
    b();
 //logic
}

@Transactional(propagation = Propagation.REQUIRED)
public void b(){
    //logic
} 
}

¿Cuántas transacciones abren Spring en este ejemplo de código?

0
Иван Гладуш 26 feb. 2018 a las 11:39

4 respuestas

La mejor respuesta

No importa. Al llamar a b() desde a() no pasará por el proxy, por lo que no se considerarán los atributos transaccionales en b().

El código de ejemplo tiene 1 transacción abierta si a() o b() se llama a través del proxy (es decir, fuera de la clase) y aún no hay una transacción en curso.

3
Kayaman 26 feb. 2018 a las 09:20

De la documentación de primavera: https: //docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Propagation.html

REQUERIDO: admite una transacción actual, crea una nueva si no existe

Solo crea una transacción.

2
Pablo 26 feb. 2018 a las 08:46

En referencia a la documentación Propagation.REQUIRED admite una transacción actual, cree una nueva si no existe ninguna. La respuesta a tu pregunta es:

1 transacción, si no hay transacción cuando se llama A # a ().

0- cero si ya hay uno porque será reutilizado.

1
Montassar El Béhi 26 feb. 2018 a las 08:49

Agregué a @pablo responder al aviso de que en su ejemplo no puede ver la diferencia real porque llama a su método dentro del mismo objeto, lo que hace que el comportamiento de @transacción en el segundo método sea transparente sin efecto:

En el modo proxy (que es el predeterminado), solo se interceptan las llamadas a métodos externos que ingresan a través del proxy. Esto significa que la auto invocación, en efecto, un método dentro del objeto de destino que llama a otro método del objeto de destino, no dará lugar a una transacción real en tiempo de ejecución, incluso si el método invocado está marcado con @Transactional

3
elmehdi 26 feb. 2018 a las 08:51