我知道命令不应该失败,所以我需要在发送命令之前验证我的命令。
但是,如果两个用户都在更新同一个聚合根,并且都是有效的,那么我们就会遇到并发问题。
如何在NEventStore中处理此问题?我的客户端需要得到一个版本号或提交id,他们传递在保存事件,如果它已经改变,然后我引发一个异常?
正如您所提到的,管理事物的一种方法是指定您期望在Load
聚合时采取行动的版本(这有一个过载)。
如果您生成的事件与其他事件冲突,那么提交阶段将[通过Domain]产生ConcurrencyException
:-
- 已经存在[你没有加载到聚合中]。 竞争进程并发写
确保你读过NuGet包放入项目中的.doc文件——它涵盖了JO EventStore如何处理这个问题的基本原理。
更新清晰 NB虽然这所有的作品和有时是必要的,通常你会发现,作为一个默认应该努力抵达幸福的地方),你可以管理这些冲突解决的事情,使你的命令自然幂等在自然和/或使用自然的冲突解决机制作为一个整体系统中为了不需要依靠你的事件存储警卫队提供如此低的水平(如etag,在发生冲突时重试命令等)。如果您发现自己在实践中正沿着这条路走下去,那么我建议您在DDD-CQRS列表中使用足够的实际用例来讨论您的策略。