true transaction transacciones requires_new example java spring transactions

java - transaction - Comprender las transacciones de Spring: ¿qué sucede cuando un método transaccional llama a otro método transaccional?



transacciones en spring boot (1)

Dos respuestas:

a) no lo hagas Utilice @Transactional en la capa de servicio o en la capa dao, pero no en ambas (la capa de servicio es la opción habitual, ya que probablemente desee una transacción por método de servicio)

b) si lo haces, lo que sucede depende del atributo de propagation de la anotación @Transactional y se describe en esta sección: 10.5.7 Propagación de la transacción . Básicamente: PROPAGATION_REQUIRED significa que se usará la misma transacción para ambos métodos, mientras que PROPAGATION_REQUIRES_NEW inicia una nueva transacción.

Sobre tus comentarios:

Por supuesto, seguí leyendo y me di cuenta de que, como estoy utilizando proxies, este segundo método no será administrado por el proxy transaccional, por lo que es como cualquier otra llamada a método.

Eso no es cierto en su situación (solo si ambos métodos pertenecen a la misma clase).

Si un bean tiene los métodos a y b , y a llamadas b , se llama a b sobre el método real, no el proxy, porque se llama desde el proxy (un bean no sabe que está conectado al mundo exterior )

proxy bean a() --> a() | V b() --> b()

En su situación, sin embargo, un servicio tendría un objeto dao inyectado, que sería un proxy en sí mismo, por lo que tendría una situación como esta:

proxy bean service a() --> a() | /---------/ | V dao b() --> b()

Para entender el funcionamiento de las transacciones de Spring, quiero saber qué sucede en el siguiente caso en el que un método marcado como @Transactional llama a otro método marcado como @Transactional .

Supongamos que la configuración usa todas las configuraciones predeterminadas.

@Service("myService") @Transactional public MyService{ public void myServiceMethod(){ myDAO.getSomeDBObjects(); } } @Repository("myDAO") @Transactional public MyDAOWithUsesBeyondMyService{ public void getSomeDBObjects(){...} }

Ahora si tuviera que ingresar a MyService.myServiceMethod() , claramente comenzaría una transacción. Luego, al myDAO.getSomeDBObjects() en myDAO.getSomeDBObjects() ¿qué pasaría? ¿El hecho de que una transacción ya exista no hace que nazca una nueva transacción, o estoy creando dos transacciones aquí?

La documentación (citada a continuación) sobre Propagación parece cubrir esto, pero me gustaría verificar mi comprensión, fue un poco para mi cerebro virgen comprender todo a la vez.

Propagación : por lo general, todo el código ejecutado dentro de un alcance de transacción se ejecutará en esa transacción. Sin embargo, tiene la opción de especificar el comportamiento en el caso de que se ejecute un método transaccional cuando ya existe un contexto de transacción. Por ejemplo, el código puede continuar ejecutándose en la transacción existente (el caso común); o la transacción existente puede suspenderse y crearse una nueva transacción. Spring ofrece todas las opciones de propagación de transacciones familiares de EJB CMT. Para leer sobre la semántica de la propagación de transacciones en Spring, consulte la Sección 10.5.7, "Propagación de transacciones".