ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 在域驱动设计中,事务是否可以修改多个聚合?

2019-06-24 00:58:39  阅读:342  来源: 互联网

标签:java transactions domain-driven-design aggregateroot


在“领域驱动设计:解决软件核心中的复杂性”中,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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有