Diferencias entre require_new y propagación anidada en transacciones Spring


80

No puedo entender la diferencia de comportamiento entre las políticas de propagación PROPAGATION_REQUIRES_NEWy PROPAGATION_NESTED. Me parece que en ambos casos, el proceso actual se revierte, pero no toda la transacción. ¿Cualquier pista?


7
Vea este enlace: forum.springsource.org/archive/index.php/t-16594.html - Juergen Hoeller lo explica muy bien
Ralph

@Ralph: gracias, eso es exactamente lo que estaba buscando. Deberías agregarlo como respuesta.
Alexis Dufrenoy

1
@Ralph: genial, esa sería la mejor respuesta.
Nandkumar Tekale

1
Entonces, la principal diferencia es que con una política de transacciones anidadas, la transacción se puede revertir al principio de la operación atómica actual, que es la misma que en una política require_new, pero solo se confirmará al final de todo el proceso. que es completamente diferente de la política require_new, donde cada operación atómica será confirmada cuando finalice.
Alexis Dufrenoy

1
@Ralph desafortunadamente, su enlace ya no apunta a una página existente :(
knittl

Respuestas:


117

¿Ver este enlace: PROPAGATION_NESTED versus PROPAGATION_REQUIRES_NEW? Juergen Hoeller lo explica muy bien. - Spring Source Forum está completamente fuera de línea desde el 28 de febrero de 2019, pero puede leer la parte relevante del artículo en la cita a continuación.

PROPAGATION_REQUIRES_NEW inicia una nueva transacción "interna" independiente para el alcance dado. Esta transacción se confirmará o revertirá de forma completamente independiente de la transacción externa, con su propio alcance de aislamiento, su propio conjunto de bloqueos, etc. La transacción externa se suspenderá al comienzo de la interna y se reanudará una vez que la interna haya terminado. ...

PROPAGATION_NESTED por otro lado inicia una transacción "anidada", que es una verdadera subtransacción de la existente. Lo que sucederá es que se tomará un punto de guardado al comienzo de la transacción anidada. Si la transacción anidada falla, volveremos a ese punto de guardado. La transacción anidada es parte de la transacción externa, por lo que solo se confirmará al final de la transacción externa. ...


Buena respuesta y buena pregunta. Tus comentarios y el siguiente enlace me resultaron muy útiles: byteslounge.com/tutorials/…
yaki_nuka

¿Es el comportamiento correcto que describió en propagation_requires_new? porque cuando lo verifiqué, revierte tanto la transacción.
eatSleepCode

aclare el comportamiento de la transacción externa si la transacción anidada falla (¿también fallará?) Y viceversa
gstackoverflow

Entonces, con la transacción anidada, cuando la interna retrocede, la externa continúa en el punto de guardado, mientras que cuando la externa retrocede, todas las acciones se retroceden, ¿verdad?
Wecherowski

¿Alguna diferencia de comportamiento?
gstackoverflow

14

PROPAGATION_REQUIRES_NEW: utiliza una transacción completamente independiente para cada alcance de transacción afectado. En ese caso, las transacciones físicas subyacentes son diferentes y, por lo tanto, pueden confirmarse o revertirse de forma independiente, y una transacción externa no se ve afectada por el estado de reversión de una transacción interna.

PROPAGATION_NESTED: utiliza una sola transacción física con múltiples puntos de guardado a los que puede retroceder. Tales reversiones parciales permiten que el alcance de una transacción interna active una reversión para su alcance, y la transacción externa puede continuar la transacción física a pesar de que algunas operaciones se hayan revertido. Esta configuración generalmente se asigna a los puntos de guardado de JDBC, por lo que solo funcionará con transacciones de recursos de JDBC.

comprobar la documentación de primavera


2
Sí, entiendo la diferencia subrayada, pero no veo cómo se comportará de manera diferente: en un caso, revertiré a al punto de guardado anterior, en el otro, revertiré la transacción actual y no la externa, pero de hecho, en ambos casos retrocederé al comienzo de la operación atómica actual y comenzaré de nuevo desde ese punto.
Alexis Dufrenoy

1
@Traroth: Las dos líneas en el enlace de @Ralph dirían la diferencia en el comportamiento. PROPAGATION_REQUIRES_NEW: La transacción externa se suspenderá al comienzo de la interna y se reanudará una vez que se complete la interna. Cada transacción interna confirmada / revertida cuando se completa. PROPAGATION_NESTED: La transacción anidada es parte de la transacción externa, por lo que solo se confirmará al final de la transacción externa.
Nandkumar Tekale

Estoy de acuerdo, así que le sugerí que hiciera una respuesta a su comentario.
Alexis Dufrenoy

1
@Traroth: Estoy de acuerdo contigo. :) Tiene la mejor respuesta.
Nandkumar Tekale

-6

Encuentra la diferencia

1.) Use of NESTED Transaction

Ejecutar dentro de una transacción anidada si existe una transacción actual, comportarse como PROPAGATION_REQUIRED else. La transacción anidada es compatible con Spring

2.) Uso de Transacción REQUERIDA Apoye una transacción actual, cree una nueva si no existe ninguna. . Significa para dominios bancarios como retirar, depositar, actualizar la transacción

3.) Uso de la transacción REQUIRES_NEW Cree una nueva transacción y suspenda la transacción actual si existe.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.