2012-08-01 11 views
10

Moje bieżące zrozumienie zagnieżdżonych transakcji w TSQL polega na tym, że jeśli masz wiele transakcji (kilka transakcji zagnieżdżonych w jednej "zewnętrznej" transakcji), wszystkie transakcje muszą zostać zatwierdzone (z "zewnętrzną" transakcją jako ostatnia) dla wszelkich zmian w bazie danych, które należy wprowadzić. Jeśli liczba zatwierdzeń jest mniejsza niż liczba otwartych transakcji, nie są dokonywane żadne zmiany związane z żadną transakcją. Czy jest to poprawny przegląd działania transakcji zagnieżdżonych?Transakcje zagnieżdżone w TSQL

Odpowiedz

12

Twój opis COMMIT jest poprawny.

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

Jednak, jak to opisano w artykule Kaleń, w odległości ROLLBACK w zagnieżdżonej transakcją wycofywania całą transakcję zewnętrzną, nie tylko transakcji wewnętrzną, gdzie następuje wycofania.

zwrócić uwagę na następujące wyniki:

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

ROLLBACK TRAN 
SELECT @@trancount 

Jest to opisane w artykule MSDN, Nesting Transactions:

dzieło ROLLBACK lub ROLLBACK transakcji, która nie ma nazwę transakcja wycofuje wszystkie transakcje i dekrety zagnieżdżone @@ TRANCOUNT na 0. TRANSAKCJA ROLLBACK, w której używana jest transakcja nazwa najbardziej zewnętrznej transakcji w zestawie transakcji zagnieżdżonych wycofuje wszystkie zagnieżdżone transakcje i dekrementy @@ TRANCOUNT do 0. Jeśli nie masz pewności, czy jesteś już w transakcji, WYBIERZ @@ TRANCOUNT, aby określić, czy jest to 1 lub więcej. Jeśli @@ TRANCOUNT ma wartość 0, oznacza to, że nie jesteś w transakcji.

3

Krótko mówiąc, twoja odpowiedź brzmi: tak. Od Nesting Transactions:

Zatwierdzanie transakcji wewnętrznych jest ignorowane przez silnik bazy danych SQL Server . Transakcja została zatwierdzona lub wycofana w oparciu o akcję podjętą na końcu najbardziej zewnętrznej transakcji. Jeśli zostanie zatwierdzona zewnętrzna transakcja , wewnętrzne transakcje zagnieżdżone są również zatwierdzane. Jeśli zewnętrzna transakcja zostanie wycofana, wszystkie wewnętrzne transakcje również zostaną wycofane, niezależnie od tego, czy wewnętrzne transakcje zostały zatwierdzone indywidualnie.

Jeśli chodzi o ROLLBACk, dozwolona jest tylko ROLLBACK całą zewnętrzną transakcję.