2011-08-23 15 views
5

Nella mia app, ci sono più passaggi in cui molti commit al database saranno effettuati sequenzialmente attraverso più metodi. Esempio:Transazione nidificata utilizzando Spring e Hibernate

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

A chiama B che chiama C. Poi B chiama D. D chiama E e così via. Tutti questi metodi hanno alcune operazioni di database. Come ho capito dal PROPAGATION_REQUIRED (gestione dichiarativa delle transazioni - il modo consigliato primavera), se E si completa correttamente, la transazione (e le operazioni in E verranno confermate). Ora, a causa di alcune eccezioni, F dovrebbe portare a un rollback. Voglio avere tutto roll-back a partire da ciò che A ha fatto. E 'possibile tramite la gestione delle transazioni dichiarative? O dovrei usare la gestione della transazione programmatica?

Grazie.

risposta

7

In primo luogo, le transazioni "nidificate", nel senso che esistono più transazioni in esecuzione l'una con l'altra, non sono supportate, afaik.

Poi, propagation=REQUIRED significa che tutti i metodi con cui la propagazione saranno:

  • iniziare una nuova transazione, se non c'è nessuno esiste
  • partecipare a una transazione esistente se esiste.

Ciò significa che nel vostro scenario, un fallimento in F avrebbe rollback l'intera transazione (perché è una singola transazione, iniziata da A, e propagato ad altri metodi)

+0

mi sarebbe completamente d'accordo con te fino a quando non ho letto (da qualche parte - non riesco a trovare dove fosse) che il commit si verifica non appena il metodo è completato. Penso di aver torto nella comprensione qui. Quando avviene il vero e proprio commit (non dobbiamo farlo esplicitamente, giusto?)? –

+1

il commit si verifica quando il metodo che ha avviato la transazione è stato completato. È 'A' in questo caso – Bozho

+0

ok. grande. Grazie mille. –

Problemi correlati