2012-08-01 25 views
10

Ciao, la mia attuale comprensione delle transazioni nidificate in TSQL è che se si hanno più transazioni (più transazioni nidificate all'interno di una transazione "esterna"), tutte le tranasactions devono essere impegnate (con la transazione "esterna" essendo l'ultimo) per eventuali modifiche al database da effettuare. Se il numero di commit è inferiore al numero di transazioni aperte, non vengono apportate modifiche a nessuna delle transazioni. Questa è una panoramica corretta di come funzionano le transazioni nidificate?Transazioni nidificate in TSQL

risposta

12

La descrizione di COMMIT è corretta.

Kalen Delaney has an article covering the same type of behavior that you describe.

Tuttavia, come discusso nell'articolo di Kalen, un ROLLBACK all'interno di una transazione nidificata sarà rollback l'intera transazione esterno, non solo l'operazione interno dove si verifica il ripristino.

Nota i seguenti risultati:

BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 
BEGIN TRAN 
SELECT @@trancount 

ROLLBACK TRAN 
SELECT @@trancount 

questo è descritto in questo articolo di MSDN, Nesting Transactions:

UN'OPERA ROLLBACK o un'istruzione ROLLBACK TRANSACTION che non ha un nome di transazione esegue il rollback tutte le transazioni nidificate e decrementa @@ TRANCOUNT a 0. UNA TRANSAZIONE ROLLBACK che utilizza la transazione nome della transazione più esterna in una serie di transazioni nidificate ripristina tutte le transazioni nidificate e decrementa @@ TRANCOUNT su 0. Quando non si è sicuri se si è già in una transazione, selezionare @@ TRANCOUNT per determinare se è 1 o più. Se @@ TRANCOUNT è 0, l'utente non si trova in una transazione.

3

In breve, la vostra risposta è sì. Da Nesting Transactions:

Commettere transazioni interne viene ignorato dal database di SQL Server Engine. La transazione è impegnata o ripristinata sulla base di l'azione intrapresa alla fine della transazione più esterna. Se la transazione esterna viene impegnata, anche le transazioni interne nidificate vengono commesse . Se la transazione esterna viene annullata, tutte le transazioni interne vengono anche ripristinate, indipendentemente dal fatto che le transazioni interne di siano state eseguite singolarmente.

Per quanto riguarda i ROLLBACks, è consentito solo eseguire il ROLLBACK dell'intera transazione esterna.