3

我知道命令不应该失败,所以我需要在发送命令之前验证我的命令。

但是,如果两个用户正在更新同一个聚合根并且两者似乎都是有效的,那么我们就会遇到并发问题。

我如何在 NEventStore 中处理这个问题?我的客户是否需要获取他们在保存事件时传递的版本号或提交 ID,如果它已更改,那么我会引发异常?

4

1 回答 1

4

正如您所提到的,管理事物的一种方法是指定您Load在聚合时期望执行的版本(这有一个重载)。

ConcurrencyException如果您生成的事件与事件发生冲突,则提交阶段将 [通过域]产生:-

  • 已经存在[您没有加载到聚合中]。
  • 由竞争进程同时写入

确保对 NuGet 包放入项目的 .doc 文件进行 >1 次读取 - 它涵盖了 JO EventStore 如何处理此问题的基础知识。

为清楚起见更新注意虽然这一切都有效并且有时是必要的,但总的来说,您会发现 [并且默认情况下应该努力到达快乐的地方] 您可以通过自然地制作命令来管理大多数这些冲突解决的事情本质上是幂等的和/或在您的整个系统中使用自然的冲突解决机制,以便不需要依靠您的事件存储来提供如此低级别的保护(例如,etags,在发生冲突时重试命令等) . 如果您发现自己在实践中走上了这条道路,我建议您在 DDD-CQRS 列表中使用足够多的实际用例来讨论您的策略。

于 2013-01-22T11:15:53.427 回答