2012-12-21 9 views
17

Czasami widziałem następujący fragment kodu. Kiedy jest if @@trancount > 0 konieczne z begin try? Oboje? Lub jest to bezpieczny sposób (najlepsza praktyka), aby sprawdzić to zawsze w przypadku wycofania przed czekiem?Kiedy trzeba sprawdzić @@ transcount> 0 w bloku catch catch?

begin tran 
begin try 
    ... just several lines of sql ... 
    if @@trancount > 0 commit tran 
end try 
begin catch 
    if @@trancount > 0 rollback tran 
end catch 

Odpowiedz

8

mogę wymyślić kilka scenariuszy do rozważenia przy rozpatrywaniu @@trancount:

  1. Obecna transakcja została wywołana z innej procedury przechowywanej, który miał własnej transakcja
  2. Obecna transakcja nazwano przez jakiś kod .NET z własną transakcją
  3. Bieżąca transakcja jest jedyną transakcją

Wierzę, że Remus Rusanu to Exception handling and nested transactions obsługuje wszystkie te możliwości.

+0

Przykład wygląda na to, że staramy się unikać transakcji zagnieżdżonych. Czy to konieczne? – ca9163d9

+0

Według mnie, jeśli ta nowa akcja jest transakcją zagnieżdżoną, zapisz ją. Jeśli wystąpi błąd, a jest to transakcja zagnieżdżona, wycofaj zagnieżdżoną transakcję, aby nie wpłynąć na pierwotną osobę dzwoniącą. – 8kb

+0

4: kiedy wywołujesz zaszyfrowane API SP, które nie wycofuje własnej transakcji, jeśli stwierdzi, że jest problem ... –

Powiązane problemy