2012-06-09 16 views
11

Non ho mai capito a cosa serva una transazione nidificata. Il commit di una transazione nidificata non impegna nulla, ma diminuisce solo di @@TRANCOUNT. E ROLLBACK rollback tutto.Scopo delle transazioni nidificate

BEGIN TRANSACTION 
    //do an update 
    BEGIN TRANSACTION 
    //do an insert 
    COMMIT TRANSACTION 
COMMIT TRANSACTION 

Qual è la differenza con questo:

BEGIN TRANSACTION 
    //do an update 
    //do an insert 
COMMIT TRANSACTION 

Si prega di farmi un esempio perché devono essere utilizzati transazioni nidificate e come fanno la differenza.

saluti, Petar

risposta

8

transazioni nidificate consente il codice per chiamare altro codice (SP per esempio), che utilizza le transazioni si senza realmente commettere tua transazione quando hanno commettono.

Detto questo, è possibile utilizzare i punti di sicurezza per eseguire il rollback all'interno di una transazione.

C'è uno CodeProject article dedicato a questo.

+0

Posso utilizzare i punti di sicurezza senza utilizzare transazioni nidificate. La procedura memorizzata è un buon punto (non ci avevo mai pensato). Ma se non utilizzo una stored procedure nella mia transazione (o non chiamo altro codice), perché dovrei aver bisogno di transazioni nidificate? Vedo continuamente esempi con transazioni nidificate e non vedo il punto di essi. –

+0

Quindi le transazioni nidificate sono utili solo quando si chiama il codice transazionale esterno? –

+1

Sono d'accordo con te e penso che siano utili per chiamare il codice transazionale esterno. La capacità tecnica di SQL Server di gestire transazioni nidificate è importante e non disponibile in tutti i sistemi DB. Ci sono alcuni casi (come con gli SP citati - dove si dovrebbe anche usare ['SET XACT_ABORT ON'] (http://stackoverflow.com/questions/1150032/what-is-the-benefit-of-using-set -xact-abort-on-in-a-stored-procedure)) dove possono nidificare "naturalmente". Non ho mai usato transazioni nidificate esplicite. – Lucero

0

SE si dispone di uno scenario in cui si chiama un SP che contiene un'altra chiamata SP in esso. e questo SP interiore può anche essere chiamato indipendentemente dalla tua applicazione. In tal caso è necessario inserire la transazione interna (su SP interno) e SP padre.

Problemi correlati