Ich möchte eine benutzerdefinierte AutoCloseable
-Klasse erstellen, damit ich das umsetzen kann:
in den leichteren
%Vor% Transaction
wäre die AutoCloseable
hier und in close()
würde sie die Transaktion je nach Bedarf festschreiben oder zurücksetzen.
Aber damit das funktioniert, müsste ich in Transaction.close()
erkennen, ob eine Ausnahme innerhalb des try-Blocks aufgetreten ist oder ob sie normal abgeschlossen wurde. Ist das überhaupt möglich?
Wenn es erforderlich ist, den Stack-Trace von einer neuen Ausnahme zu analysieren, ist das in Ordnung. Einfachere Programmierung wäre den kleinen Performance-Hit wert, der bringt.
Das, was mir am nächsten kommt, erfordert immer noch, den Erfolg der Transaktion manuell als letzte Anweisung des Blocks zu markieren:
%Vor%Obwohl sich mein Code von Ihrem unterscheidet, hatte ich eine ähnliche Notwendigkeit, automatisch die (meisten) Transaktionen zu committen und einen Rollback bei Fehlern durchzuführen.
Meistens ist mein Code mit einfachen Abfragen versehen, die automatisch wie folgt zurückgesetzt werden:
%Vor%Einige Datenbanken lassen Abfragen nicht so zurückrollen, also habe ich das gelöst, indem ich zwischen "schreiben" und "lesen" Transaktionen unterscheidet. Wenn es sich um eine Lesetransaktion handelt, wird close () dies bestätigen, andernfalls wird ein Rollback ausgeführt. Außerdem wird überprüft, ob Sie beim Erstellen einer schreibgeschützten Transaktion keine Schreibaktionen ausführen. So, jetzt kann ich schreiben:
%Vor%Schreib-Transaktionen müssen sich am Ende noch selbst aufrufen, aber dies ist eine Minderheit von Fällen.
Mir ist klar, dass das nicht das ist, wonach du gefragt hast, aber vielleicht ist es noch nützlich.
Das, was ich am ehesten erreichen konnte, ist, commit () explizit aufzurufen, und davon auszugehen, dass jeder Code, der den Transaktionsblock verlässt, ohne dass ein Rollback durchgeführt werden sollte. Dies steht im Einklang mit Transaktionen in anderen Sprachen. Während Sie vergessen können, commit () aufzurufen (wie ich es oft tue), wird zumindest dieser Teil des Codes sehr wahrscheinlich getestet werden. Und es ist unmöglich, das Zurücksetzen auf die Ausnahme zu vergessen, die weniger wahrscheinlich eine Testabdeckung hat.
Dies ähnelt der Idee von Millimoose, eine Flagge zu setzen:
%Vor%, außer dass Sie nur den aktiven Status als Flag verwenden. Gleiche Menge an Code, keine neue Flagge erforderlich. Dies setzt voraus, dass jede Transaktion, für die commit () nicht explizit aufgerufen wurde, zurückgesetzt werden soll, was zu folgendem Code führt:
%Vor%Ich kann immer noch nicht glauben, dass es in der Kernsprache keine sauberere Lösung dafür gibt.
Tags und Links java exception-handling java-7 transactions