当您希望代码在竞争条件下工作时,通常是开发人员使用 乐观的并发控制 (OCC)。来自维基百科:
...在提交之前,每笔交易都验证没有其他交易 事务已修改它已读取的数据。如果检查显示 相互冲突的修改,提交事务回滚......
实现OCC的方法是检查a version
要修改的数据。如果版本不同,那么其他事务已修改数据,并由应用程序决定如何解决冲突(重新尝试,通知用户......)。
草案如下:
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时,哪些其他方法可以保留OOC?
一个可行的选项,它可以在存储时查找冲突事件。这种方法允许对事件进行细粒度控制。我不知道这是否会使解决方案复杂化,或者我认为这是一个“标准” http://danielwhittaker.me/2014/09/29/handling-concurrency-issues-cqrs-event-sourced-system/
问题描述中的任何空白都是值得赞赏的。提前致谢!