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 @Transactional
Serviceschicht 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.
quelle
Antworten:
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.
quelle
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.
quelle
@Transaction
Anmerkung angeben , so dass nur 1 Transaktion verwendet wird, wie hier@Transactional
auf sowohl den Service und die DAO. Dann tut die zusätzliche Anmerkung nicht weh, hilft aber auch nicht.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.
quelle
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 ...
quelle
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.
quelle