Базовый и важный метод разработки REST API.

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

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

Давайте посмотрим на упрощенную версию процесса оформления заказа в онлайн-корзине ниже. Предположим, что клиент произвел платеж, и мы обработаем отправленную онлайн-корзину покупок следующим образом:

  1. Создать запись о доставке
  2. Отправить уведомление клиенту
  3. Обновить статус корзины на «Отправлено»

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

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

В этой статье я поочередно расскажу вам о каждом подходе, чтобы создать решение для обнаружения и возврата ошибки 409 Conflict в случае дублирования запросов.

Вариант №1 — Проверка существования записи перед вставкой

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

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