Wo sollte "@Transactional" Service Layer oder DAO sein


80

Erstens ist es möglich, dass ich etwas frage, das zuvor gefragt und beantwortet wurde, aber ich konnte kein Suchergebnis zurückbekommen. Okay, allgemein (oder immer so weit :)) Wir definieren Transaktionsanmerkungen auf der Serviceschicht

Controller-> Manager-> Dao-> Orm.

Ich habe jetzt eine Situation, in der ich zwischen dem Domänenmodell basierend auf der Client-Site wählen muss. Angenommen, Client A verwendet mein Domain-Modell. Alles ist in Ordnung, aber dann würde mir eine andere Client-Site einen Webdienst anbieten und unser Domain-Modell nicht verwenden.

Welche Schicht soll ich ersetzen? Ich glaube, es muss DAO sein, das mir Daten vom Webdienst abruft und zurücksendet. Das sind zwei separat geschriebene DAO-Ebenen, die je nach Szenario angeschlossen werden.

Ich habe jetzt festgestellt, dass wir beim Einlegen der @TransactionalServiceschicht eine enge Kopplung durchgeführt haben (wenn es so etwas gibt oder wenn wir sagen, dass wir keine lose Kopplung haben) . So viele Gehirne können sich nicht irren oder sind es (ich bezweifle es).

Die Frage lautet also "Wo soll" @Transactional"Service Layer oder DAO sein?" und ist es Service-Schicht nach unten, die ich ersetzen sollte.


6
Diese Frage ist eigentlich ein Duplikat der Best Practice von Spring @Transactional Annotation .
Pascal Thivent

Antworten:


79

Im Idealfall repräsentiert die Service-Schicht ( Manager ) Ihre Geschäftslogik und sollte daher mit Anmerkungen versehen werden @Transactional.

Die Serviceschicht kann verschiedene DAOs aufrufen, um DB-Operationen auszuführen. Nehmen wir eine Situation an, in der Sie 3 DAO-Operationen in einer Servicemethode haben. Wenn Ihre erste DAO-Operation fehlgeschlagen ist, werden möglicherweise noch zwei weitere übergeben, und Sie erhalten einen inkonsistenten DB-Status. Das Kommentieren der Service-Schicht kann Sie vor solchen Situationen bewahren.


Danke für deine Antwort. Können Sie bitte das Jahr angeben, in dem Sie geantwortet haben? Ob Sie es glauben oder nicht, ich glaube, Sie haben gerade die Existenz einer Zeitmaschine bewiesen. Gab Ihnen +1 im Jahr 2015.
Shahzeb

Ich habe das Jahr nicht bemerkt, bis du gefragt hast :)
Badal

60

Sie möchten, dass Ihre Dienste transaktional sind. Wenn Ihre DAOs transaktional sind und Sie in jedem Service unterschiedliche DAOs aufrufen, haben Sie mehrere Transaktionen, was nicht das ist, was Sie wollen. Machen Sie die Serviceaufrufe transaktional, und alle DAO-Aufrufe innerhalb dieser Methoden nehmen an den Transaktionen für die Methode teil.


6
konnte er keine Propagierungsmethode in seiner @TransactionAnmerkung angeben , so dass nur 1 Transaktion verwendet wird, wie hier
Fotis Paraskevopoulos

1
@FotisParaskevopoulos Das würde nur funktionieren , wenn er @Transactionalauf sowohl den Service und die DAO. Dann tut die zusätzliche Anmerkung nicht weh, hilft aber auch nicht.
William F. Jameson

6

Ich werde vorschlagen, @Transactional in Service-Layer-Methoden einzufügen, da wir mehrere DAO-Implementierungen haben können. Auf diese Weise können wir sicherstellen, dass unsere Dienstleistungen transaktional sind. verweisen

Die beste Vorgehensweise besteht darin, einen generischen BasicService zu verwenden, um allgemeine Dienste anzubieten.

Der Service ist der beste Ort, um @Transactional zu platzieren. Die Service-Schicht sollte das Anwendungsfallverhalten auf Detailebene für eine Benutzerinteraktion enthalten, die logisch in eine Transaktion einfließen würde. Auf diese Weise können wir die Trennung zwischen Webanwendungscode und Geschäftslogik aufrechterhalten.

Es gibt viele CRUD-Anwendungen, die keine wesentliche Geschäftslogik haben, da eine Service-Schicht, die nur Daten zwischen den Controllern und Datenzugriffsobjekten durchläuft, nicht sinnvoll ist. In diesen Fällen können wir Dao mit Transaktionsanmerkungen versehen.

In der Praxis können Sie sie also an jedem Ort platzieren, es liegt an Ihnen.

Wenn Sie mehrere Anrufe in Ihrem Dienst haben, benötigen Sie @Transactional im Dienst. Verschiedene Serviceanrufe werden in verschiedenen Transaktionen ausgeführt, wenn Sie @Transactional in Betrieb nehmen.


0

Es ist eine persönliche Entscheidung, die auf Anwendungstypen basiert. Wenn die Anwendung über viele Module verteilt ist und die meisten Vorgänge auf @ CRUD basieren, ist die Verwendung von @ Transaktionsanmerkungen auf Serviceebene sinnvoller. Anwendungen vom Typ Engine wie Scheduler, Jobserver usw. Berichts-Apps, bei denen keine Sitzungen und kein Benutzerkonzept vorhanden sind, sind Propagationstransaktionen auf Kontextebene am besten geeignet. Wir sollten am Ende keine Clusterd-Transaktionen erstellen, indem wir @transactional überall dort platzieren, wo Transaktions-Anti-Patters enden ... sowieso für pragmatische Transaktionen Kontrolle JTA2 ist die am besten geeignete Antwort ... wieder hängt es vom Wetter ab, ob Sie es in bestimmten Situationen verwenden können ...


0

Sie sollten @Transactional auf Serviceebene verwenden. Wenn Sie das Domänenmodell für Client B ändern möchten, bei dem Sie dieselben Daten in einem anderen Modell bereitstellen müssen, können Sie das Domänenmodell ändern, ohne die DAO-Ebene zu beeinträchtigen, indem Sie einen anderen Service oder bereitstellen Durch Erstellen einer Schnittstelle und Implementieren der Schnittstelle in einem anderen Modell und mit demselben Service wird das Modell basierend auf dem Client gefüllt. Diese Entscheidung basiert auf den Geschäftsanforderungen und dem Umfang des Projekts.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.