Проблема:
Два сотрудника (A и B) одновременно выходят в автономном режиме при редактировании клиента № 123, скажем, версии №20, а в автономном режиме продолжают вносить изменения...
Сценарии:
1 - Два сотрудника редактируют клиента № 123 и вносят изменения в один или несколько идентичных атрибутов.
2 - Два сотрудника редактируют клиента № 123, но НЕ делают те же изменения (они пересекают друг друга, не касаясь).
... они затем возвращаются в режиме онлайн, первый сотрудник A добавляет, тем самым меняя клиента на версию № 21, а затем сотрудник B, все еще на версии №20
Вопросы:
Какие изменения мы сохраняем в сценарии 1?
Можно ли выполнить слияние в сценарии 2, как?
Контекст:
1 - система CQRS + система поиска событий
2 - Использовать Event Sourcing Db в качестве очереди
3 - Конечная согласованность в модели чтения
4 - API RESTful
EDIT-1: Разъяснения, основанные на ответах до сих пор:
Чтобы выполнить оштукатуренное слияние, мне нужно будет иметь одну команду для каждого поля в форме, например?
Выше, мелкозернистые команды для ChangeName, ChangeSupplier, ChangeDescription и т.д., каждая со своей собственной меткой времени, позволит автоматически слить в событиях A и B оба обновленных ChangedName?
Редактировать-2: следить за использованием определенного хранилища событий:
Кажется, что я буду использовать @GetEventStore для сохранения моих потоков событий.
Они используют Optimistic Concurrency следующим образом:
-
Каждое событие в потоке увеличивает версию потока на 1
-
Writes может указывать ожидаемую версию, используя заголовок ES-ExpectedVersion для авторов
-
-1 указывает, что поток еще не существует
-
0 и выше указывает версию потока
-
Ошибки не будут выполняться, если поток не находится в версии, вы либо повторите попытку с новым ожидаемым номером версии, либо обработали поведение, и решили, что это нормально, если вы это сделаете.
-
-
Если версия ES-Expected Version не указана, оптимизированное управление Concurrency отключено
-
В этом контексте Оптимистичный Concurrency основан не только на идентификаторе сообщения, но также на событии #