2010-05-05 3 views
3

Так что мне нравится базовая концепция CQS, где у вас может быть команда, которая записывает в одну базу данных и которая обновляет базу данных запросов, с которой вы читаете.Подтверждение ответа на запрос команды для повторных попыток

Однако рассмотрите сценарий, в котором вы вводите данные, и хотите предотвратить дублирование.

Использование новой записи данных сотрудника регистр служащего в качестве примера, работая через кучу заявок на ввод в реквизитах новых сотрудников:

  1. Возьмите верхний лист.
  2. Введите имя сотрудника и номер уникальной платежной ведомости в пользовательский интерфейс.
  3. Отправить.
  4. Положить бумагу в «завершенную кучу».
  5. Повторите.

Как вы теперь можете запретить пользователю вводить один и тот же номер платежной ведомости, например, если они отвлекаются и не могут вспомнить, были ли они уже введены ключом, а в «сообщении» нет вернулись к запросу db для поиска пользователя?

ответ

1

Прежде всего вы можете легко использовать локальный кеш, чтобы убедиться, что непосредственный пользователь не повторно использует те же номера снова. Это достаточно легко.

Но на самом деле это не останавливает тот факт, что по ошибке два человека могут одновременно использовать одну и ту же критическую часть данных. Как сказал кто-то еще, хотя это вне CQRS. Это может произойти практически в любой архитектуре.

Теперь главное, что CQRS может изменить, - это то, как мы реагируем на конфликт. Я вижу два возможных решения:

  1. Система отправляет команду и ожидает ожидаемого результата. Если это сбой, вы просто запрашиваете фиксированную информацию и повторите попытку.Из всего, что я слышал, это кажется неправильным и даже может быть анти-шаблоном, хотя я не настолько близко к эксперту, чтобы говорить в любом случае.

  2. Система отправляет команду и, в конце концов, пользователь получает информацию о конфликте. Где-то они могут пойти, чтобы исправить проблему. В вашем случае введите новый номер (который может снова конфликтовать).

0

Я предлагаю изменить рабочий процесс к этому

  1. Проверьте верхний лист берется или нет в базе данных (вы должны иметь таблицу R помнить берется ли конкретная строка или нет), если принимать, то return false если нет, тогда возьмите верхний лист. и установить флаг для принятой строки, которая будет «взята» в таблице R
  2. Введите имя сотрудника и номер уникальной платежной ведомости в пользовательский интерфейс.
  3. Отправить.
  4. Положить бумагу в «завершенную кучу».
  5. Повторите.

Шаг должен выполняться атомарно.

+0

Но это именно тот процесс, который я описал, - вопрос находится на вашем шаге 1 - как вы знаете, что вы не просто отправили верхний лист, если вы проверяете до того, как сообщение обновило запрос дб? –

+0

Потому что вы можете ограничить извлечение. Когда пользователь получил верхнюю запись, вы пометили ее как «взятую», что означает, что только 1 клиент получил это. – zsong

0

Не могли бы вы отслеживать список уже введенных комбинаций номеров сотрудников/платежных ведомостей на клиенте? Если это веб-клиент, он может быть файлом cookie, если он является толстым клиентом, затем памятью или другим. Когда они впервые войдут в систему, очистите список и начните заново.

1

Ввод данных - это несовместимый домен - у вас нет нескольких пользователей, выполняющих действия на одном и том же общем наборе данных. Таким образом, CQRS не имеет особого значения.

+0

Моя проблема не в том, что у нескольких пользователей это один и тот же пользователь, отправляющий одну и ту же вещь дважды. Я не могу полагаться на запрос базы данных, чтобы предотвратить их выполнение, потому что данные могут не быть в базе данных вовремя. –

+0

Я хочу сказать, что вы не должны использовать односторонние команды (a la CQRS) для этого - полностью синхронизируйте его до БД. Будь проще :) –

Смежные вопросы