Trigger in Kombination mit Transaktion

25

Angenommen, wir haben die folgende Situation:

Wir haben einen Tisch (sagen wir mal Table_A), an dem ein Auslöser hängt INSERT. Der Auslöserjob besteht darin, einige Zeilen in table_Bbasierend auf den eingefügten Werten in zu aktualisieren table_A.

Nun ist alles in Ordnung, wenn wir einfach eine Zeile in die Tabelle einfügen, aber was ist mit Situationen, in denen wir Daten über eine Transaktion einfügen ?. Wartet der Trigger, bis alle Transaktionsanweisungen erfolgreich ausgeführt wurden, oder wird er ausgelöst, sobald er die Einfügung erkennt? Wenn der Trigger beim Erkennen der ersten Einfügung sofort ausgelöst wird, was passiert, wenn die Transaktion in der letzten Zeile fehlschlägt? Gibt es einen Mechanismus für diese Situation?

veljasije
quelle

Antworten:

37

Ein Insert befindet sich immer in einer Transaktion.

Wenn Sie kein explizites BEGIN TRAN ... COMMIToder haben, SET IMPLICIT_TRANSACTIONS ONwird die Anweisung als eigenständige automatische Festschreibungstransaktion ausgeführt .

Der Trigger ist immer Teil der Transaktion für die Aktion, die den Trigger auslöst. Wenn im Trigger ein Fehler auftritt, der ein Rollback der Transaktion verursacht, wird auch die Auslöseaktion zurückgesetzt.

Trigger haben implizit XACT_ABORTan. Ein Fehler mit dieser Einstellung führt automatisch zu einem Transaktions-Rollback (mit Ausnahme von Fehlern, die im Code mit der RAISERRORAnweisung ausgelöst wurden).

Martin Smith
quelle