2009-02-09 14 views
28

Stellen Sie sich das folgende Szenario:Verschachtelte Transaktionen in SQL Server

Ich bin mit SQL Server 2005. Ich habe eine Transaktion, die unter anderem SQL-Anweisungen ruft eine gespeicherte Prozedur, die auch eine Transaktion nach innen hat. Die äußere Transaktion schlägt manchmal fehl und es wird zurückgesetzt, nachdem die gespeicherte Prozedur erfolgreich aufgerufen und festgeschrieben wurde.

Meine Frage ist, ist die Transaktion Rollback der gespeicherten Prozedur auch?

Antwort

36

Mit einer verschachtelten Transaktion verpflichten a schreibt keine Änderungen auf der Festplatte, mit Ausnahme der obersten Ebene Transaktion. Ein Rollback funktioniert jedoch unabhängig von der Ebene der Transaktion, also ja, es wird die innere Transaktion zurückrollen.

+6

Rollback wird -alle- Transaktionen zurück, nicht nur die vorherige. ZB: http://www.emoreau.com/Entries/Articles/2011/02/EricMoreau1.gif –

+4

@ Pure.Krome ist korrekt. Verschachtelte Transaktionen * tun * nicht, was Sie wollen. Siehe die [SQL Server Myth-a-Day-Serie] (http://www.sqlskills.com/blogs/paul/post/A-SQL-Server-DBA-myth-a-day-%282630%29-nested-transactions- are-real.aspx) –

+0

Bestätigung: http://technet.microsoft.com/en-us/library/ms189336(v=sql.90).aspx – Vadzim

2

Ja, die gespeicherte Prozedur wird zurückgesetzt.

Hier ist der Gesamtablauf des Codes:

BEGIN TRY 

    BEGIN TRANSACTION 

    EXEC SotredProcedureName 

    --Do some other activity 

    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 

    --IF an error occurs then rollback the current transaction, which includes the stored procedure code. 
    ROLLBACK TRANSACTION 

END CATCH 

Cheers, John

7

Absolut ja, die Transaktion auf der obersten Ebene wird alle Datenänderungen besitzen, bis sie festgeschrieben oder zurückgesetzt wird.

Allerdings würde ich Sie ermutigen, über das Transaktionsmodell sorgfältig nachzudenken. Je mehr solche Szenarien in Ihrem System vorhanden sind, desto größer sind Ihre Probleme mit Sperrproblemen. Auch der Rechenaufwand des Verfahrens steigt.

Es ist bemerkenswert, wie oft, wenn ich SQL rationalisiere, finde ich Transaktionen, wo sie gerade nicht benötigt werden. Ich ermutige Sie (und jeden, der mit Transaktionen arbeitet), sorgfältig darüber nachzudenken, warum Sie sie in jedem Kontext verwenden und was passieren würde, wenn die Transaktion nicht umgesetzt würde. Nur mein 2c Wert!

1

Ich habe versucht mit begin tran und commit innerhalb der gespeicherten Prozedur sagen usp_test.
Exec diese sp mit einer anderen Abfrage, wie unten

update x set name='xxx' 
select * from x---contains 'xxx' 
begin tran 
update x set name='yyy' 
select * from x---contains 'yyy' 
exec usp_test 
select * from x---contains 'zzz' inside the sp 
rollback tran 

Während der obigen Abfrage-Namen in x-Tabelle ausführt, muss ‚xxx‘ sein nicht ‚zzz‘ sein, da die erste tran beginnen rollbacked auch die sp tran begehen.
Also, beginne zuerst die Datenänderungen zu übernehmen.

Verwandte Themen