2009-02-09 23 views
28

Wyobraźmy sobie następujący scenariusz:zagnieżdżone transakcje w SQL Server

Używam SQL Server 2005. Mam transakcję, która dzwoni, między innymi SQL, procedurę składowaną, która ma również transakcji wewnątrz. Transakcja zewnętrzna czasami kończy się niepowodzeniem i jest wycofywana po wywołaniu i zatwierdzeniu procedury składowanej.

Moje pytanie brzmi: czy wycofywanie transakcji w procedurze przechowywanej jest zbyt duże?

Odpowiedz

36

Z zagnieżdżonych transakcji commit nie pisać żadnych zmian na dysku, z wyjątkiem transakcji górnym poziomie. Wycofanie działa jednak niezależnie od poziomu transakcji, więc tak, wycofa wewnętrzną transakcję.

+6

przywracania będzie wycofać transakcji -all-, nie tylko poprzednie. EG: http://www.emoreau.com/Entries/Articles/2011/02/EricMoreau1.gif –

+4

@ Pure.Krome jest poprawny. Zagnieżdżone transakcje * nie * rób tego, co chcesz. Zobacz serię [SQL Server Myth a Day] (http://www.sqlskills.com/blogs/paul/post/A-SQL-Server-DBA-myth-a-day-%282630%29-nested-transactions- are-real.aspx) –

+0

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

2

Tak procedura składowana zostanie wycofana.

Oto ogólny przepływ kodzie:

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

Absolutnie tak, transakcja na najwyższym poziomie będzie właścicielem wszystkich zmian danych, dopóki nie zostanie zatwierdzona lub wycofana.

Jednak zachęcam do ostrożnego przemyślenia modelu transakcji. Im więcej takich scenariuszy istnieje w twoim systemie, tym większa twoja ekspozycja na problemy z blokowaniem. Zwiększa się również koszt obliczeniowy procedury.

Niezwykle często, gdy racjonalizuję SQL, stwierdzam, że transakcje zostały zaimplementowane, gdy nie są po prostu wymagane. Zachęcam ciebie (i każdego, kto pracuje z transakcjami), by dokładnie przemyślał, dlaczego używasz ich w każdym kontekście i co by się stało, gdyby transakcja nie była realizowana. Tylko moja wartość 2c!

1

Próbowałem już z rozpoczęciem tran i zatwierdzam wewnątrz procedury przechowywanej powiedz usp_test.
Exec te sp z innej kwerendy jak poniżej

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 

Realizując powyższą nazwę zapytania w tabeli x musi być „xxx” nie jego „zzz”, ponieważ tran pierwszy rozpocząć rollbacked nawet tran sp popełnienia.
Tak więc najpierw zacznij tran own zmiany danych.