it-swarm.com.de

Auslöser in Kombination mit Transaktion

Angenommen, wir haben die folgende Situation:

Wir haben eine Tabelle (sagen wir Table_A), Die einen Auslöser für INSERT hat. Der Triggerjob besteht darin, einige Zeilen in table_B Basierend auf den in table_A Eingefügten Werten zu aktualisieren.

Jetzt 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 sofort ausgelöst wird, wenn er die erste Einfügung erkennt, was passiert, wenn die Transaktion in der letzten Zeile fehlschlägt? Gibt es einen Mechanismus für diese Situation?.

25
veljasije

Eine Einfügung ist immer innerhalb einer Transaktion.

Wenn Sie kein explizites BEGIN TRAN ... COMMIT oder SET IMPLICIT_TRANSACTIONS ON dann läuft die Anweisung als eigenständige Auto-Commit-Transaktion .

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

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

38
Martin Smith