当你想让代码在竞态条件下运行时,常见的做法是使用乐观并发控制(OCC)。根据维基百科:
...在提交之前,每个事务都会验证没有其他事务修改了它读取的数据。如果检查发现有冲突的修改,提交事务将回滚...
一种实现OCC的方法是检查待修改数据的版本
。如果版本不同,则表示其他事务已经修改了该数据,应用程序需要决定如何解决冲突(重新尝试、通知用户...)。
一个草案如下:
class Repository
{
public class save($data)
{
$currentVersion = $data->version;
$data->version = $currentVersion + 1;
$result = $this->db->update($data, [
'id' => $data->id,
'version' => $currentVersion
]);
if (1 === $result) {
// everything ok
} else {
// conflict!
}
}
}
我的问题是,在 EventSourcing
中,我们只会追加发生在领域中的所有事件,因此我们不能再使用这种方法来实现 OCC。还有哪些方法可以在使用 EventSourcing 的同时保持 OCC?
一种可能的选择是在存储事件时查找冲突的事件。这种方法允许对事件进行精细的控制。我不知道这是否会使解决方案过于复杂,或者这是一个被指出的“标准”,可以在http://danielwhittaker.me/2014/09/29/handling-concurrency-issues-cqrs-event-sourced-system/找到。
非常感谢你的帮助,如果对问题描述有任何疏漏之处,请指出。谢谢!