编程语言
首页 > 编程语言> > java – 在域驱动设计中,事务是否可以修改多个聚合?

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