2014-08-01 3 views
0

В киоске веб-сайта пользователь смог добавить товары в свою корзину, ввести всю необходимую информацию и нажать кнопку отправки. Отобразилось пользователю, пожалуйста, подождите, пока выполняется заказ.Обработка сетевых сбоев во время транзакции

За кулисами представление передало информацию контроллеру, контроллер, называемый бизнес-логикой, на карточную кредитную карту .. результат был успешным. Затем контроллер назвал бизнес-логику для сохранения порядка в базе данных ... этот результат был успешным. Следующее, что должен был сделать контроллер, - отправить перенаправление обратно в представление. Проблема заключается в том, что пользовательская связь потери в то время, так что Интернет никогда не получал перенаправление. Когда сетевое соединение было восстановлено (разговора несколько секунд), веб-страница по-прежнему показывала заказ, поэтому пользователь повторно отправил его. Итак, теперь у пользователя есть дубликат (разные идентификаторы). Как мне решить эту проблему? Я предполагаю, что это краевой случай, по крайней мере, я надеюсь, что так оно и есть.

+0

О чем вы спрашиваете, это одна из многих проблем, решаемых полем [CQRS] (http://martinfowler.com/bliki/CQRS.html). Это обширная школа мысли о том, как следует делать архитектуру, поэтому я не предлагаю, чтобы вы переключились на нее полностью, пока что-то простое, как предложила Альбин. Однако, если вы заинтересованы в том, чтобы справляться с трудными сценариями, как это, вы должны прочитать его и заимствовать идеи по мере необходимости. –

ответ

2

Создайте уникальный идентификатор транзакции id/order при загрузке формы. Следите за используемым идентификатором транзакции: s, либо в памяти, либо в базе данных, чтобы убедиться, что вы не отправляете одну и ту же форму дважды.

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

+0

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

+0

@GeorgeMauer, необязательно, вы также можете создавать серверную часть, когда вы обслуживаете страницу и сохраняете список идентификаторов: s, которые вы сгенерировали, но не были возвращены. –

+0

Thats true, и технически ваш идентификатор сеанса уже идентифицирует пользователя, и вы можете использовать его для сопоставления с этим идентификатором транзакции. Но на самом деле для моих денег просто создание идентификатора на клиенте намного проще. –

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