问题:
两名员工(A 和 B)在编辑客户 #123(例如版本 #20)时同时下线,而在下线时继续进行更改...
场景:
1 - 两名员工编辑客户 #123 并对一个或多个相同属性进行更改。
2 - 两名员工编辑客户 #123,但不进行相同的更改(他们相互交叉但不接触)。
...然后他们都重新上线,第一个员工 A 追加,从而将客户更改为版本 #21,然后是员工 B,仍然在版本 #20
问题:
我们在场景 1 中保留谁的更改?
我们可以在场景 2 中进行合并,如何?
语境:
1 - CQRS + 事件溯源风格系统
2 - 使用事件溯源数据库作为队列
3 - 读取模型的最终一致性
4 - RESTful API
EDIT-1:根据迄今为止的答案进行澄清:
例如,为了执行细粒度合并,我需要为表单中的每个字段设置一个命令?
上面,ChangeName、ChangeSupplier、ChangeDescription 等的细粒度命令,每个都有自己的时间戳,将允许在事件 A 和 B 都更新 ChangedName 时自动合并?
Edit-2:根据特定事件存储的使用情况进行跟进:
似乎我将使用 @GetEventStore 来持久化我的事件流。
他们使用乐观并发如下:
流中的每个事件都会将流版本增加 1
写入可以指定预期版本,利用写入器上的 ES-ExpectedVersion 标头
-1 指定流不应该已经存在
0及以上指定流版本
如果流不是该版本,则写入将失败,您可以使用新的预期版本号重试,或者您重新处理该行为并决定如果您这样选择就可以了。
如果未指定 ES-Expected Version,则禁用乐观并发控制
在这种情况下,Optimistic Concurrency 不仅基于 Message ID,还基于 Event #