2013-04-24 8 views
2

Почему стойкость SQL для EventStore @Jonathan Oliver использует CommitSequence как один из критериев для обнаружения дублирующего коммита? Почему бы не было StreamId и CommitId?EventStore DuplicateCommit Query

См. SQL ниже.

SELECT COUNT(*) 
FROM Commits 
WHERE StreamId = @StreamId 
    AND CommitSequence = @CommitSequence 
    AND CommitId = @CommitId 

Этот оператор SQL от SqlPersistenceEngine.DetectDuplicate(). Он используется для определения того, нужно ли бросать DuplicateCommitException или просто ConcurrencyException.

ответ

1

Не знаете, к чему относится ваш SQL.

Причина, по которой CommitSequence участвует в уникальных индексах, - это то, что 2 человека пишутся, одновременно изменяя v5, можно написать v6 с 1 событием, а другой - записать v6 с другим событием.

В некоторых случаях у всех авторов есть общий источник идентификаторов Commit, но довольно часто (и Common Domain делает это), просто генерируется случайный Guid в качестве идентификатора Commit, и в этом случае вы все еще хотите, чтобы конфликт был обнаружено.

Я думаю, что можно было бы использовать GUID для создания фиксированной последовательности, которая кодирует StreamVersion (v6 выше), чтобы сгенерировать идентификатор Commit, чтобы сделать его избыточным, но для меня это довольно явно необходимо и полезно.

Обязательно прочитайте readme в пакете NuGet BTW - большая часть этого материала хорошо объясняется ИМО.

+0

Спасибо за ваш вклад Рубен. Вышеуказанный SQL-оператор относится к SqlPersistenceEngine.DetectDuplicate. Этот оператор используется для определения того, нужно ли вызывать DuplicateCommitException или просто исключение ConcurrencyException. Мне кажется, что различие - это обнаружение дублирования обработки сообщений против одновременных сводных изменений. Но если это так, я не понимаю, почему CommitSequence является частью запроса. Мои идентификаторы транзакций поступают из моих сообщений. – Joe

+0

@ Joe гораздо лучше сейчас. Если это одна и та же фиксация, ее можно сбросить на пол. Если это не так, то перехват разрешения конфликтов в общем домене позволяет решить, основываясь на настраиваемой стратегии по вашему выбору, являются ли они эквивалентными, прежде чем принимать решение об откате или нет. Это принцип, но, честно говоря, я никогда не реализовывал такую ​​часть управления конфликтами, поэтому я больше не буду осмеливаться объяснять, почему именно ** именно так. Надеюсь, у кого-то есть ответ от уст лошади для вас скоро! –