5

In DDD sollte das Aggregat die Transaktionsgrenze darstellen. Eine Transaktion, die die Einbeziehung von mehr als einem Aggregat erfordert, ist oft ein Zeichen, dass entweder das Modell verfeinert werden sollte oder die Transaktionsanforderungen überprüft werden sollten oder beides.Multiple Aggregates Root INSTANCES pro Transaktion

Bedeutet dies, dass die Transaktionsgrenze pro Aggregatstamm INSTANCE oder pro Aggregat ist?

Angenommen, ich habe eine aggregierte Wurzel namens "Node", innerhalb jedes "Node" habe ich eine Sammlung von "Fields (Value-Objekten)". Jedes "Feld" hat einen Typ und kann vom Typ "Knoten" sein. In meinem Fall, wenn es vom Typ "Node" ist, werde ich die ID an den "Node" aggregierten Root speichern.

Node (AggregateRootID 1) 
---> Field1 : String (John) 
---> Field2 : String (Doe) 
---> Field3 : Node (AggregateRootID 2) 

Node (AggregateRootID 2) 
--> Field1 : String (Jane) 
--> Field2 : String (Doe) 

Wenn ich eine Transaktion habe, die beide AggregateRoots-Instanzen aktualisiert, ist das gültig?

Oder bedeutet es, wenn ich "Knoten" Aggregat und "Element" Aggregat habe, dass ich nicht beide in einer Transaktion aktualisieren kann?

Antwort

6

Ich denke, ein AR kann mehr über die Konsistenz Grenze als die Transaktion Grenze sein.

Die Tatsache, dass eine Transaktion zufällig gut an eine AR-Grenze passt, ist nur Zufall.

Da Transaktionen eher ein Problem der Anwendungsschicht sind, gibt es nicht unbedingt ein Designproblem, wenn Sie mehr als ein AR in einer Transaktion haben.

In der Tat würde ich so weit gehen, zu sagen, dass Sie in einigen 100% -Konsistenz-Anforderungsszenarien nicht einmal die Wahl haben, sondern alle Änderungen in eine Transaktion einzubeziehen.

+0

Das ist teilweise falsch, AR sind Konsistenz Grenzen, aber auch AR sind Transaktionsgrenzen. Wenn Sie zulassen, dass mehr als ein Aggregat pro Transaktion geändert wird, erhöht sich das Risiko von Ausnahmen wegen falscher Parallelität bis zu dem Punkt, an dem das System unbrauchbar werden könnte. Mehrere Transaktionen können jedoch pro Transaktion erstellt werden. – plalx

+0

Also sagst du, dass es auch teilweise korrekt ist? :) Man sollte nicht zu oft auf das Szenario eingehen und es kann sehr gut auf ein Designproblem hinweisen und es kann verschiedene Wege geben. Überweisen Sie Geld zwischen zwei Konten. Wenn ein Konto ein AR ist, möchten Sie wahrscheinlich beide 100% konsistent. In der realen Welt gibt es jedoch selten Kontrolle über beide Konten, so dass eine eventuelle Konsistenz ausreichen muss. Jedenfalls stimme ich zu, dass man versuchen sollte, diese Szenarien möglichst zu vermeiden. –

0

Angenommen, Sie arbeiten mit CQRS in einem Async-Modell, dann werden Ihre Aggregatgrenzen wahrscheinlich das einzige innerhalb dieser Transaktion geänderte Aggregat. Das ist das genaue Gegenteil, wenn Sie CQRS in einem Synchronisationsmodell verwenden oder wenn Sie RPC N-Tier-Entwicklungsstil verwenden, bei dem in einem Clientaufruf einige Änderungen an Ihrem Datenmodell vorgenommen werden. In diesem letzten Fall haben Sie definitiv mehrere Instanzen von Aggregaten innerhalb derselben Transaktion (z. B. Arbeitseinheit mit Transaktionsbereich).

Ich glaube nicht, dass es eine richtige oder falsche Antwort auf Ihre Frage gibt, ohne mehr über die Architektur Ihres Systems zu wissen. DDD allein kann die Regeln für Ihre systemweiten Transaktionen nicht festlegen. Was ich sicher sagen kann, ist, wenn Sie zufällig ein async, ereignisbasiertes System mit cqrs verwenden und zufällig mehr als ein Aggregat pro Transaktion ändern, dann, und das ist nur meine Meinung, etwas scheint nicht zu sein Recht.

Verwandte Themen