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?
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
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. –