Was ist ein guter Weg, um gespeicherte Prozesse so robust zu machen, dass sie sehr gut skaliert werden können und auch Fehlerbehandlung enthalten?
Was ist außerdem der beste Weg, um mehrere Fehlerszenarien in einem gespeicherten Prozess zu behandeln und über ein intelligentes Feedback-System zu verfügen, das aussagekräftige Fehlerinformationen an die aufrufenden Apps zurückgibt?
Antworten:
Alex Kuznetsov hat ein großartiges Kapitel in seinem Buch Defensive Database Programming (Kapitel 8), das sich mit T-SQL TRY ... CATCH, T-SQL-Transaktionen und SET XACT_ABORT-Einstellungen sowie der clientseitigen Fehlerbehandlung befasst. Es wird Ihnen sehr bei der Entscheidung helfen, welche der Optionen für das, was Sie erreichen müssen, am sinnvollsten ist.
Es ist kostenlos auf dieser Website verfügbar . Ich bin in keiner Weise mit dem Unternehmen verbunden, aber ich besitze die gedruckte Version dieses Buches.
Es gibt viele kleine Details zu diesem Thema, die von Alex sehr gut erklärt werden.
Per Nicks Bitte ... (aber nicht alles ist im Kapitel)
In Bezug auf die Skalierung müssen Sie brutal ehrlich sein, welche Aktivitäten im Datenbankcode enthalten sein müssen und welche in der App enthalten sein sollten. Haben Sie jemals bemerkt, wie schnell ausführender Code dazu neigt, für ein einzelnes Problem pro Methode zu entwerfen?
Die einfachste Art der Kommunikation wären benutzerdefinierte Fehlercodes (> 50.000). Es ist auch ziemlich schnell. Dies bedeutet, dass Sie den Datenbankcode und den App-Code synchron halten müssen. Mit einem benutzerdefinierten Fehlercode können Sie auch nützliche Informationen in der Fehlermeldung zurückgeben. Da Sie ausschließlich für diese Situation einen Fehlercode haben, können Sie einen Parser in den App-Code schreiben, der auf das Datenformat des Fehlers zugeschnitten ist.
Welche Fehlerbedingungen erfordern eine Wiederholungslogik in der Datenbank? Wenn Sie es nach X Sekunden erneut versuchen möchten, sollten Sie dies besser im App-Code behandeln, damit die Transaktion nicht so stark blockiert. Wenn Sie einen DML-Vorgang nur sofort erneut senden, kann es effizienter sein, ihn im SP zu wiederholen. Beachten Sie jedoch, dass Sie möglicherweise Code duplizieren oder eine Ebene von SPs hinzufügen müssen, um einen erneuten Versuch durchzuführen.
Wirklich, das ist derzeit der größte Schmerz bei der TRY ... CATCH-Logik in SQL Server. Es kann getan werden, aber es ist ein bisschen dumm. Suchen Sie in SQL Server 2012 nach einigen Verbesserungen, insbesondere nach erneuten Auslösen von Systemausnahmen (unter Beibehaltung der ursprünglichen Fehlernummer). Außerdem gibt es FORMATMESSAGE , die eine gewisse Flexibilität beim Erstellen von Fehlermeldungen bietet, insbesondere für Protokollierungszwecke.
quelle
Dies ist unsere Vorlage (Fehlerprotokollierung entfernt)
Anmerkungen:
... erstellen Sie also nicht mehr TXNs als Sie benötigen
Jedoch,
quelle
Ich benutze Try / Catch, sammle aber auch so viele Informationen wie möglich und schreibe diese nach dem Rollback in ein Fehlerprotokoll. In diesem Beispiel ist "LogEvent" eine gespeicherte Prozedur, die in eine EventLog-Tabelle schreibt und die Details zu den Ereignissen enthält. GetErrorInfo () ist ein Funktionsaufruf, der die genaue Fehlermeldung zurückgibt.
Wenn ein Fehler auftritt, werden die Informationen gesammelt, die Prozedur springt zum Abschnitt zur Fehlerbehandlung und gibt einen Rollback aus. Die Informationen werden in das Protokoll geschrieben, und die Prozedur wird beendet.
In Anbetracht der zusätzlichen Prozedur- / Funktionsaufrufe scheint es etwas übertrieben. Diese Methode ist jedoch äußerst hilfreich, wenn Sie versuchen, das Problem zu beheben.
quelle