为什么@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
。
不确定你的SQL是关于什么的
CommitSequence参与唯一索引的原因是,如果两个人同时写v5,一个人可能写一个v6事件,另一个写一个v6事件。
在某些情况下,所有的编写者都有一个共同的提交Id来源,但通常(common Domain就是这样做的),一个只是生成一个随机的Guid
作为提交Id,在这种情况下,您仍然希望检测到冲突。
我猜一个人可以滥用guid来创建一个固定的序列,编码StreamVersion(上面的v6)来生成提交Id,使其冗余,但对我来说,这显然是非常需要和有用的。
请务必阅读NuGet包中的自述文件——我觉得大部分内容都解释得很好。