2013-04-16 10 views
5

Mam pytanie dotyczące dokumentacji MSDN dla bloków TRY CATCH. Sprawdź ten artykuł i przewiń do przykładu C „za pomocą try ... catch z XACT_STATE”Serwer SQL WYPRÓBUJ ... POŁACZ z XACT_STATE

http://msdn.microsoft.com/en-us/library/ms175976.aspx

Przykład pierwszy umieszcza COMMIT TRANSACTION wewnątrz bloku try, a następnie umieszcza drugi w bloku catch jeżeli XACT_STATE()=1 .

Jednak pomyślałem, że blok Catch będzie wykonany tylko w przypadku błędu. W jaki sposób można więc wykonać zarówno blok Catch, jak i XACT_STATE return 1? Wydaje się to sprzeczne.

Istnieje komentarz bez odpowiedzi w dokumentacji XACT_STATE który zadaje to samo pytanie

http://msdn.microsoft.com/en-us/library/ms189797.aspx

+0

Chcesz wybrać odpowiedź lub ją podać? Przeznaczę długą drogę dla twojego przedstawiciela SO – dotnetguy

Odpowiedz

2

@ user1181412 mojej analizy jest następujący: Komentarz:

- klucz obcy ograniczenia istnieją w tej tabeli.

--This oświadczenie generuje błąd naruszenia ograniczenia

jest odpowiedź na swoje pytanie. Dzieje się tak, że po wykonaniu instrukcji DELETE generowany jest błąd przekroczenia ograniczenia, a kolejne polecenie COMMIT nie jest wykonywane. XACT_STATE transakcji jest teraz 1 i blok CATCH jest wykonywany.

Na górze masz

SET XACT_ABORT ON;

Powoduje to stan transakcji będzie niemożliwy do zatwierdzenia i stąd ten blok kodu będzie wycofywania transakcji:

-- Test whether the transaction is uncommittable. 
IF (XACT_STATE()) = -1 
BEGIN 
    PRINT 
     N'The transaction is in an uncommittable state.' + 
     'Rolling back transaction.' 
    ROLLBACK TRANSACTION; 
END; 

Jednakże, jeśli zmieni się na "SET XACT_ABORT OFF"; następnie blok CATCH zostanie trafiony, chociaż stan transakcji będzie "możliwy do wykonania" jako XACT_STATE = 1.

UWAGA: Usunięcie nadal nie być wykonane jako naruszenie ograniczenia nadal istnieje, ale można zobaczyć drukowane:

(1 row (s) affected) Transakcja jest committable.Committing transakcję.