Udostępnij za pośrednictwem


Rollbacks and Commits in Stored Procedures and Triggers

Wykonywanie transakcji ROLLBACK lub przekazywać transakcję Transact-SQL Instrukcja w procedurze przechowywanej lub wyzwalacza jest to możliwe, ale robić tak mogą powodować błędy.

W przechowywanych procedur

Jeśli po zakończeniu procedura przechowywana nie miał, gdy wykonano procedury, @@ TRANCOUNT ma inną wartość, wystąpi błąd informacyjny (266).Taka sytuacja może wystąpić na dwa sposoby:

  • Procedura przechowywana jest nazywane z @@ TRANCOUNT 1 lub nowszego i transakcji ROLLBACK wykonuje procedurę przechowywaną instrukcja.Zmniejsza @@ TRANCOUNT 0 i powoduje błąd 266 po zakończeniu procedura przechowywana.

  • Procedura przechowywana jest nazywane z @@ TRANCOUNT 1 lub nowszego i wykonuje procedurę przechowywaną przekazywać transakcję instrukcji.@@ TRANCOUNT zmniejsza o 1 i powoduje błąd 266 po zakończeniu procedura przechowywana.Jednak jeśli instrukcji BEGIN TRANSACTION jest wykonywany po transakcji zatwierdzanie, błąd nie występuje.

W wyzwalaczy

Wyzwalacz działa tak, jakby tam obowiązywały transakcja pozostała po wyzwalacz jest wykonywany.Jest to możliwe, czy instrukcja wyzwalania wyzwalacz jest przez transakcję bezpośrednia lub pośrednia.

Po uruchomieniu instrukcja wykonywania tryb automatycznego zatwierdzania istnieje dorozumianych BEGIN TRANSAKCJA do umożliwienia odzyskiwanie o wszystkich zmianach generowane przez instrukcję, jeśli napotkają błąd.Implikowane ta transakcja nie ma wpływu na inne instrukcje w tej instancji, ponieważ zostanie zatwierdzona lub wycofywany po zakończeniu instrukcja.Implikowane ta transakcja jest nadal obowiązują, niemniej jednak, gdy wywoływana jest funkcja wyzwalacza.

Wyzwalacz jest wykonywany, uruchamiany jest transakcja niejawna.Jeśli wyzwalacz kończy wykonywanie i @@ TRANCOUNT = 0, wystąpi błąd 3609 i wsadowego jest przerywane.Jeżeli instrukcja BEGIN TRANSACTION zostało wydane w wyzwalacz, tworzy zagnieżdżonych transakcji.W takim przypadku podczas wykonywania instrukcja zatwierdzanie TRANSACTION instrukcja będą dotyczyć tylko transakcji zagnieżdżonych.

W przypadku korzystania z ROLLBACK TRANSACTION w wyzwalacz, należy pamiętać o następujących zasadach:

  • Wszystkie zmiany danych dokonane czy punkt w bieżącej transakcji są przywracane, łącznie z dowolną, które zostały wprowadzone przez wyzwalacz.

  • Wyzwalacz kontynuuje wykonywanie wszelkich pozostałych instrukcji po instrukcji ROLLBACK.Jeśli dowolna z tych instrukcji modyfikuje dane, modyfikacje nie są wycofywane.

  • ROLLBACK w wyzwalacz zostanie zamknięte, a zwalnia wszystkie kursory, które zostały zgłoszone i otwartych partia, zawierające instrukcję, która uruchomienia wyzwalacza.Dotyczy to także kursory zgłoszone i otworzyć w procedurach przechowywanych przez partia do uruchomienia wyzwalacza.Kursory zadeklarowane w instancji przed do partia, który wyzwalacz uruchamiany tylko są zamknięte.Jednak STATYCZNE lub INSENSITIVE kursory pozostają otwarte jeśli:

    • CURSOR_CLOSE_ON_COMMIT jest zestaw OFF.

    • kursor statyczny znajduje się zarówno synchronicznego lub całkowicie wypełnionego kursor asynchronicznego.

Zamiast ROLLBACK TRANSACTION instrukcja SAVE TRANSACTION może służyć do wykonywania częściowego przywrócenia w wyzwalacza.