java – 在域驱动设计中,事务是否可以修改多个聚合?
作者:互联网
在“领域驱动设计:解决软件核心中的复杂性”中,Evans定义
An Aggregate is a cluster of associated objects that we treat as a unit for the purpose of data changes.
显然,这意味着必须在单个事务中更新聚合.
但是,事务必须只更新单个聚合吗?如果是这样,为什么?
我的研究
我问,因为在第360页的“实施领域驱动设计”中,弗农写道:
Both the referencing aggregate and the referenced aggregate must not be modified in the same transaction. Only one or the other may be modified in a single transaction.
但没有给出这条规则的理由.
我理解,如果业务规则需要单个事务,则表示隐藏的不变量,这将要求实体成为同一聚合的一部分.但如果业务不关心,开发人员只是觉得方便呢?
在页437,弗农还写道:
Be careful not to overuse the ability to commit modifications to multiple aggregates in a single transaction just because it works in a unit test environment. If you aren’t careful, what works well in development and test can fail severely in production because of concurrency issues.
哪些并发问题是那些?
解决方法:
乐观并发通常用于避免存在争用的环境中的数据丢失.
让我们看看是什么会导致该机制的并发异常:
> User Foo加载版本为V1的聚合A.
>用户栏加载版本为V1的聚合A.
>用户Foo更改聚合A并保持不变(版本为
递增到V2).
>用户栏更改聚合A并尝试保持但将获得
并发异常,因为他的更改是基于V1,但是
聚合现在是V2.
如果允许每个事务修改多个聚合,则会增加并发异常的风险,这可能会损害系统的可伸缩性,直至使其无法使用.
聚合根(AR)是事务边界,其中不变量是事务一致的,因此如果您发现自己试图在同一事务中修改多个AR,则意味着您的AR边界可能是错误的,并且您可能错过了隐含的可能性概念明确.
但请注意,在单个事务中创建多个AR应该没有问题.
设计AR时常见的错误是通过过分重视语句中的关系词来创建大型集群:
“Posts have comments”
如果不存在需要该组合的不变执行,则没有理由将Post和Comment聚合在一起.两个作者是否应该同时在同一个评论上发布会导致并发异常?答案可能是否定的,具体取决于您的域名,但如果Post包含评论集合,则会有答案.
But what if the business does not care, and developers simply find it
convenient?
好吧,如果企业不关心他们的系统由于糟糕的设计决策而不可扩展,我想这是他们的选择,但开发人员不应该养成为方便而设计的习惯. DDD是关于对域进行建模的方式,而不是建模方便的方式.
标签:java,transactions,domain-driven-design,aggregateroot 来源: https://codeday.me/bug/20190624/1275729.html