Ich habe ein Problem mit der Annotation @Transactional
.
Ich habe eine Methode, etwas zu tun, und drinnen werfe ich ein und fange ein IllegalArgumentException
.
Ich denke (selbst wenn ich die Ausnahme abgefangen habe), dass es die Transaktion als rollbackOnly setzt (ein Auslöser für die Ausnahmebedingung) und es endet, ohne die Transaktion zu bestätigen.
Hier ist der Fehler:
%Vor% Ich könnte auf der @Transactional
ein No-Rollback hinzufügen - für die Ausnahme, die ich werfe und fange, aber ich denke nicht, dass es eine echte Lösung ist.
Vielleicht gibt es eine Möglichkeit, die RollbackOnly bei der Transaktion zu deaktivieren, aber ich denke nicht, dass es auch die beste Vorgehensweise ist ...
Also, haben Sie eine Idee, wie ich es tun soll?
Danke,
Versuch / Fang mit IllegalArgumentException
klingt wie ein Code-Geruch (Effektives Java Element 57: Ausnahmen nur für Ausnahmezustände verwenden )
Ob die Transaktion auf rollbackOnly
festgelegt ist, hängt vom verwendeten Proxy-Mechanismus ab. Wenn Sie JDK-Proxies verwenden, befindet sich der Handler außerhalb und hat keine Möglichkeit, eine abgefangene Ausnahme innerhalb des Methodenaufrufs zu registrieren. Wenn Sie mode=aspectj
verwenden, werden die Dinge anders aussehen. Wenn Sie Transaktionskontexte verschachtelt haben, müssen Sie @Transactional(noRollbackFor=IllegalArgumentException.class)
für die innere Methode verwenden.
Wenn Sie die Transaktion nicht festschreiben können, haben Sie wahrscheinlich eine Ausnahme in Ihrem Code. Indem Sie versuchen / fangen, verbergen Sie die vollständige Ausnahme und erhalten einfach eine heikle generische Erklärung. Sie erhalten auch einen Rollback.
Um Ihren Fehler zu verstehen und die vollständige Beschreibung Ihres Fehlers zu erhalten, versuchen Sie, die try / catch-Sache fallenzulassen und den Code explodieren zu lassen. Dort sehen Sie die wahre Ursache Ihres Problems.