598 Stimmen

Wo gehört die @Transactional-Anmerkung hin?

Sollten Sie die @Transactional im DAO Klassen und/oder deren Methoden oder ist es besser, die Dienstklassen zu annotieren, die die DAO-Objekte verwenden? Oder ist es sinnvoll, beide "Schichten" zu annotieren?

11voto

yannick555 Punkte 111

Normalerweise sollte man eine Transaktion auf der Dienstebene platzieren.

Aber wie bereits erwähnt, ist es die Atomizität einer Operation, die uns sagt, wo eine Anmerkung notwendig ist. Wenn Sie also Frameworks wie Hibernate verwenden, wo eine einzige "Speichern/Aktualisieren/Löschen/...Ändern"-Operation auf einem Objekt das Potenzial hat, mehrere Zeilen in mehreren Tabellen zu ändern (wegen der Kaskade durch den Objektgraphen), sollte es natürlich auch ein Transaktionsmanagement für diese spezifische DAO-Methode geben.

7voto

VishalTambe Punkte 157

Die Dienstebene ist der beste Ort zum Hinzufügen @Transactional Annotationen, da der Großteil der Geschäftslogik hier vorhanden ist, enthält er detailliertes Anwendungsfallverhalten.

Angenommen, wir fügen es zu DAO hinzu und rufen vom Dienst aus 2 DAO-Klassen auf, eine fehlgeschlagene und eine erfolgreiche, in diesem Fall wenn @Transactional nicht im Dienst, wird ein DB übertragen und der andere wird zurückgesetzt.

Daher empfehle ich, diese Anmerkung mit Bedacht einzusetzen und nur auf der Dienstebene zu verwenden.

Github-Projekt - java-algos

0 Stimmen

Ausnahmen wie ObjectOptimisticLockingFailureException treten nur nach Abschluss der Transaktion auf. Wenn Sie getrennte Threads für andere Operationen wie Mailservice haben, versagt dieses Design völlig. Wir leiden im Moment darunter. Die einzig verbleibende Lösung wäre AOP.

6voto

sundary Punkte 71

Es ist besser, sie in der Dienstschicht zu haben! Dies wird in einem der Artikel, auf den ich gestern gestoßen bin, deutlich erklärt! Hier ist die Verbindung die Sie ausprobieren können!

6voto

smaiakov Punkte 460

Lassen Sie uns zunächst definieren, wo wir Folgendes verwenden müssen Transaktion ?

Ich denke, die richtige Antwort ist - wenn wir sicherstellen müssen, dass eine Sequenz von Aktionen zusammen als eine atomare Operation beendet wird oder keine Änderungen vorgenommen werden, selbst wenn eine der Aktionen fehlschlägt.

Es ist gängige Praxis, Geschäftslogik in Dienste einzubinden. So können Dienstmethoden verschiedene Aktionen enthalten, die als eine einzige logische Arbeitseinheit ausgeführt werden müssen. Wenn dies der Fall ist, muss eine solche Methode markiert werden als Transaktionelle . Natürlich erfordert nicht jede Methode eine solche Einschränkung, so dass Sie nicht den gesamten Dienst als Transaktion .

Und mehr noch - vergessen Sie nicht zu berücksichtigen, dass @Transaktional kann natürlich die Leistung der Methode beeinträchtigen. Um das Gesamtbild zu sehen, müssen Sie die Transaktionsisolationsebenen kennen. Das Wissen darüber kann Ihnen helfen, die Verwendung von @Transaktional wo es nicht unbedingt notwendig ist.

6voto

Es ist besser, die @Transaktional in einer separaten mittleren Schicht zwischen DAO und Service Layer. Da Rollback sehr wichtig ist, können Sie alle Ihre DB-Manipulationen in der mittleren Schicht unterbringen und die Geschäftslogik in der Dienstschicht schreiben. Die mittlere Schicht wird mit Ihren DAO-Schichten interagieren.

Dies wird Ihnen in vielen Situationen helfen, z. B. ObjectOptimisticLockingFailureException - Diese Ausnahme tritt erst ein, wenn Ihre Transaktion beendet ist. Sie können sie also nicht in der mittleren Schicht abfangen, aber Sie können sie jetzt in Ihrer Dienstschicht abfangen. Dies wäre nicht möglich, wenn Sie @Transactional in der Serviceschicht haben. Sie können zwar im Controller abfangen, aber der Controller sollte so sauber wie möglich sein.

Wenn Sie Mails oder SMS in einem separaten Thread senden, nachdem Sie alle Optionen zum Speichern, Löschen und Aktualisieren abgeschlossen haben, können Sie dies im Dienst tun, nachdem die Transaktion in Ihrer mittleren Schicht abgeschlossen ist. Auch hier gilt: Wenn Sie @Transactional in der Service-Schicht angeben, wird Ihre Mail auch dann verschickt, wenn Ihre Transaktion fehlschlägt.

Eine mittlere @Transaktionsschicht wird also dazu beitragen, dass Ihr Code besser und einfacher zu handhaben ist. Ansonsten, Wenn Sie in der DAO-Schicht arbeiten, können Sie möglicherweise nicht alle Vorgänge zurücknehmen. Wenn Sie in der Service-Schicht verwenden, müssen Sie möglicherweise AOP (Aspect Oriented Programming) in bestimmten Fällen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X