2

为什么@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应该抛出 a 还是只抛出ConcurrencyException.

4

1 回答 1

1

不确定你的 SQL 是关于什么的。

CommitSequence 参与唯一索引的原因是,如果有 2 个人同时在修改 v5,那么一个人可能会写一个带有 1 个事件的 v6,而另一个人会写一个带有不同事件的 v6。

在某些情况下,所有编写者都有一个共同的提交 ID 来源,但很多时候(Common Domain 会这样做),只是生成一个随机Guid的提交 ID,在这种情况下,您仍然希望检测到冲突。

我想有人可能会滥用 GUID 来创建一个固定序列,该序列对 StreamVersion(上面的 v6)进行编码以生成 Commit Id 以使其冗余,但对我来说,它显然是需要和有用的。

请务必阅读 NuGet 包 BTW 中的自述文件 - IMO 对这些内容的大部分进行了很好的解释。

于 2013-04-25T00:03:58.827 回答