2011-08-23 37 views
5

En mi aplicación, hay varios pasos en los que se realizarán muchas confirmaciones de forma secuencial a través de varios métodos. Ejemplo:Transacción anidada usando Spring e Hibernate

A -> B -> C 
     -> D 
      ->E 
     -> F 
    -> G 

A llama a B que llama a C. A continuación, B llama D. D llama E y así sucesivamente. Todos estos métodos tienen algunas operaciones de base de datos. Según tengo entendido desde PROPAGATION_REQUIRED (gestión de transacción declarativa - el camino recomendado por la primavera), si E se completa con éxito, se confirmará la transacción (y las operaciones en E). Ahora, debido a alguna excepción, F debería llevar a una reversión. Quiero tener todo retroceso a partir de lo que A hizo. ¿Esto es posible a través de gestión de transacciones declarativas? ¿O debería usar Gestión de transacciones programática?

Gracias.

Respuesta

7

En primer lugar, no se admiten las transacciones "anidadas", en el sentido de que existen múltiples transacciones en ejecución una de otra, afaik.

Entonces, propagation=REQUIRED significa que todos los métodos con los que la propagación serán:

  • iniciar una nueva transacción si no hay ninguno existe
  • participar en una transacción existente en caso de existir.

Esto significa que, en su caso, un fallo en F sería retrotraer toda la transacción (porque es una sola transacción, iniciada por A, y se propagó a otros métodos)

+0

habría estado de acuerdo completamente con usted hasta que leo (en algún lugar, no puedo encontrar dónde estaba), la confirmación ocurre tan pronto como se completa el método. Creo que estoy equivocado en el entendimiento aquí. ¿Cuándo ocurre la confirmación real (no tenemos que hacerlo explícitamente, ¿verdad?)? –

+1

la confirmación ocurre cuando se completa el método que inició la transacción. Es 'A' en este caso – Bozho

+0

bien. estupendo. Muchas gracias. –

Cuestiones relacionadas