RAILS: не создавайте запись дважды, если два запроса отправляются одновременно - PullRequest
0 голосов
/ 14 января 2020

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

Это приводит к тому, что записи создаются в моей базе данных mysql дважды.

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

Единственное, о чем я могу думать, - это создание задания для каждого запроса, который выполняется через какое-то случайное время, и проверка уникальности в моей модели. Но мне интересно, есть ли лучший способ справиться с этим?

Так, как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Проверка уникальности Active Record не гарантирует уникальность на уровне базы данных.

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

Документация фактически предлагает тот же

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

0 голосов
/ 14 января 2020

Вам может помочь добавление уникальной проверки вашей модели и ограничение уникальности самой БД. Причина в том, что проверки модели будет недостаточно, она понадобится просто для того, чтобы ваше приложение «осознало» это ограничение. Что на самом деле помешает вам сохранить две повторяющиеся записи, так это ограничение БД.

Таким образом, когда два дублирующих запроса успешно пройдут проверку, первый из них создаст запись, а второй тоже попытается это сделать, но адаптер MySQL выдаст ActiveRecord::RecordNotUnique, что быть в состоянии справиться.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...