Wir haben DML-Operationen in jedem Schritt eines SQL Server-Jobs. Um sicherzustellen, dass das Update / Insert zurückgesetzt wird, falls etwas schief geht, habe ich die Datenänderungen für jeden Schritt in TRY CATCHund TRANSACTIONBlöcke eingeschlossen:
Nicht festschreibbare Transaktionen und XACT_STATE
Wenn ein in einem TRY-Block generierter Fehler dazu führt, dass der Status der aktuellen Transaktion ungültig wird, wird die Transaktion als nicht festschreibbare Transaktion klassifiziert. Ein Fehler, der normalerweise eine Transaktion außerhalb eines TRY-Blocks beendet, führt dazu, dass eine Transaktion in einen nicht festschreibbaren Zustand wechselt, wenn der Fehler innerhalb eines TRY-Blocks auftritt. Eine nicht festschreibbare Transaktion kann nur Lesevorgänge oder eine ROLLBACK-TRANSAKTION ausführen. Die Transaktion kann keine Transact-SQL-Anweisungen ausführen, die eine Schreiboperation oder eine COMMIT-TRANSAKTION generieren würden. Die Funktion XACT_STATE gibt den Wert -1 zurück, wenn eine Transaktion als nicht festschreibbare Transaktion klassifiziert wurde. Wenn ein Stapel beendet ist, setzt das Datenbankmodul alle aktiven nicht festschreibbaren Transaktionen zurück. Wenn beim Eintritt der Transaktion in einen nicht festschreibbaren Zustand keine Fehlermeldung gesendet wurde, Nach Abschluss des Stapels wird eine Fehlermeldung an die Clientanwendung gesendet. Dies zeigt an, dass eine nicht festschreibbare Transaktion erkannt und zurückgesetzt wurde.
Ihr Code sucht @@TRANCOUNTan Stellen, an denen er nicht 0 sein kann. Er verwendet eine Mischung aus informativen PRINT-Nachrichten und SELECT-Ergebnismengen, um den Erfolg zu kommunizieren. Er behandelt keine Fehler, die behoben werden können. Im Idealfall sollten die Ausnahmen an den Client weitergegeben werden, in diesem Fall an den Agent-Job (dh Ihr Fang sollte erneut ausgelöst werden).
Vielen Dank für Ihre hilfreiche Antwort und fantastische Website! Ich frage mich jedoch, ob ich dieses Muster immer noch mit einer einfachen DML-Anweisung (nicht mit einem gespeicherten Prozess) verwenden kann. Müssen wir die Transaktion auch wie folgt speichern? (Ich habe keinen Store-Proc zum Verwenden): Speichern Sie die Transaktion usp_my_procedure_name;
Sky
2
Was du hast, sieht für mich gut aus. Ich würde natürlich vorschlagen, etwas mit den Informationen zu tun, nachdem Sie die Transaktion zurückgesetzt haben, z. B. sie in ein Protokoll zu schreiben.
Vielen Dank für Ihre Antwort. Können Sie mir bitte einen Hinweis geben, wie ich sie in ein Protokoll schreiben kann?
Sky
3
Wenn Sie Fehler oder Daten in eine Protokolltabelle schreiben möchten, kopieren Sie vor dem Rollback die gewünschten Daten in eine Tabellenvariable (es ist wichtig, dass Sie eine Tabellenvariable verwenden, eine temporäre Tabelle wird zurückgesetzt.) Und führen Sie dann aus Fügen Sie dann die Daten aus der Tabellenvariablen in die Protokollierungstabelle ein.
Was du hast, sieht für mich gut aus. Ich würde natürlich vorschlagen, etwas mit den Informationen zu tun, nachdem Sie die Transaktion zurückgesetzt haben, z. B. sie in ein Protokoll zu schreiben.
quelle