Wyzwalacz w połączeniu z transakcją

25

Załóżmy, że mamy następującą sytuację:

Mamy stolik (powiedzmy Table_A), który ma spust INSERT. Zadaniem wyzwalacza jest aktualizacja niektórych wierszy w table_Boparciu o wstawione wartości w table_A.

Teraz wszystko jest w porządku, gdy po prostu wstawiamy wiersz do tabeli, ale co z sytuacjami, w których wstawiamy dane poprzez transakcję ?. Czy wyzwalacz będzie czekał na pomyślne uruchomienie wszystkich wyciągów z transakcji, czy zostanie uruchomiony, gdy tylko rozpozna wstawkę ?. Jeśli wyzwalacz jest uruchamiany natychmiast po rozpoznaniu pierwszej wstawki, co się stanie, jeśli transakcja zakończy się niepowodzeniem w ostatnim wierszu ?. Czy istnieje jakiś mechanizm dla tej sytuacji ?.

veljasije
źródło

Odpowiedzi:

37

Wstawka jest zawsze w ramach transakcji.

Jeśli nie masz wyraźnego BEGIN TRAN ... COMMITlub SET IMPLICIT_TRANSACTIONS ONinstrukcja jest uruchamiana jako samodzielna transakcja automatycznego zatwierdzania .

Wyzwalacz jest zawsze częścią transakcji dla akcji, która uruchamia wyzwalacz. Jeśli w wyzwalaczu wystąpi błąd, który powoduje wycofanie transakcji, działanie wyzwalające zostanie również wycofane.

Wyzwalacze domyślnie mają XACT_ABORTwłączone. Błąd przy tym ustawieniu automatycznie spowoduje wycofanie transakcji (z wyjątkiem błędów zgłaszanych w kodzie z RAISERRORinstrukcją).

Martin Smith
źródło