为什么@Jonathan Oliver的EventStore的SQL持久性使用CommitSequence
作为检测重复提交的标准之一?为什么StreamId
和CommitId
不够?
请参阅下面的SQL。
SELECT COUNT(*)
FROM Commits
WHERE StreamId = @StreamId
AND CommitSequence = @CommitSequence
AND CommitId = @CommitId
此SQL语句来自SqlPersistenceEngine.DetectDuplicate()
。它用于确定是应该抛出DuplicateCommitException
还是仅ConcurrencyException
。
答案 0 :(得分:1)
不确定您的SQL是什么。
CommitSequence参与唯一索引的原因是,如果2个人正在编写同时修改v5,可能会编写一个带有1个事件的v6,而另一个用不同的事件编写v6。
在某些情况下,所有编写者都有一个共同的Commit Ids源,但是经常(和Common Domain这样做),只需生成一个随机Guid
作为提交ID,在这种情况下你仍然需要要发现的冲突。
我想有人可能会滥用GUID来创建一个编码StreamVersion的固定序列(上面的v6)来生成提交ID以使其冗余,但对我而言,它显然非常需要和有用。
请务必阅读NuGet包BTW中的自述文件 - 大部分内容都能很好地解释为IMO。