gpt4 book ai didi

transactions - 使用 JOliver EventStore 更新多个聚合

转载 作者:行者123 更新时间:2023-12-04 03:55:13 25 4
gpt4 key购买 nike

我有一个关于使用 JOliver's Event Store 在单个事务中更新多个聚合的问题.据我了解,每个聚合都应该有自己的事件流。现在,虽然许多命令处理程序只会加载一个聚合并只更新该聚合(即保存这些聚合的事件),但我可以想象会有需要更新多个聚合的命令处理程序。当然,我想以交易的方式做到这一点。

但是,我不知道如何使用 Event Store 做到这一点。存储事件是通过调用 CommitChanges() 来完成的。在事件流上。如果我们有多个聚合要更新,将有多个事件流,从而多次调用 CommitChanges() .使该事务性的唯一方法是将其包装在 TransactionScope 中。 ,但这没有多大意义,因为底层存储技术可能不支持事务。所以我最终得到了这段代码,这绝对不是我要找的:

        Guid aggregateGuid1 = Guid.NewGuid();
Guid aggregateGuid2 = Guid.NewGuid();
Guid commitGuid = Guid.NewGuid();

var stream = store.OpenStream(aggregateGuid1, 0, int.MaxValue);
stream.Add(new EventMessage() { Body = new MonitorDisabled { MonitorGuid = aggregateGuid1, User = "A" } });
stream.CommitChanges(commitGuid);

stream = store.OpenStream(aggregateGuid2, 0, int.MaxValue);
stream.Add(new EventMessage() { Body = new MonitorEnabled { MonitorGuid = aggregateGuid2, User = "B" } });
// Can't commit twice with the same commit id, what if fails after first one? No way for the store to know it had to write the second part of the commit.
stream.CommitChanges(commitGuid);

这让我觉得我完全错过了应该如何使用 Event Store 的一些东西。有人可以帮我吗?非常感谢!

最佳答案

聚合定义了事务边界。

如果您需要执行跨聚合交易,您应该检查聚合并可能重新设计它们。

如果操作(命令)影响多个聚合,并且您确定聚合设计良好并映射到域中的真实一致性边界,eventual consitency可能是你正在寻找的。只需向每个聚合发送一个命令,并有两个事务,每个事务一个。如果您认为最终的一致性不适合您的情况,那么恐怕它又回到了绘图板上。

关于transactions - 使用 JOliver EventStore 更新多个聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8143194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com