@Andrey7070

Как сделать insert в базу при выполнении определенного условия?

Есть такая проблема, что с мобильного приложения на бэкенд может прийти сразу серия однотипных запросов к API, например, на добавление заказа.
При этом на бэкенде как-то нужно понять, что по факту это один и тот же заказ и сделать только один insert в таблицу с заказами. Но также должна остаться возможность принять такой же заказ по прошествии определенного времени (например, через час).
То есть нужно гарантировать, что insert будет выполнен только при условии, что за последний час подобных insert-ов не было.

Вариант делать перед insert-ом select (в котором проверять это условие) не подходит. Так как серия select-ов выполняется моментально, условие выполняется и затем все равно идет серия insert-ов.

Подскажите, как правильно реализовать это с помощью MySQL?
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 5
@kttotto
пофиг на чем писать
Если правильно, то никак. Это логика предметной области, бд не должна этим заниматься. Если клиент заказал бутылку воды, а через пять мин решил, что одной мало и решил заказать еще одну, то по Вашей логике, заказ не будет принят. Такие вещи решаются на уровне колцентров.
Если же Вы хотите защититься от спама заказов, то это всеравно не решатся уровнем бд. Это настройки Ваших серверов и работников бэкенда, по ip или по логину ограничивается количество заказов в минуту.
Ответ написан
Комментировать
idShura
@idShura
Можно делать проверку триггером перед insert
Ответ написан
Комментировать
dollar
@dollar
Делай добро и бросай его в воду.
Перед каждым insert делать select.
Чтобы гарантировать, что параллельные процессы не будут мешать друг другу, используйте LOCK TABLES.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
Вообще уже достаточно давно люди придумали транзакции. В данном случае нормальным вариантом было бы обращение к хранимой процедуре, которая в рамках транзакции произведет проверки и сделает или не сделает инсерт.
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
как уже заметил eRKa это логика уровня приложения, и к бд прямого отношения не имеет. Проверка должна выполняться в серверном приложении, и как верно предложил dollar - сначала селект - по результату инсерт.
Вариант делать перед insert-ом select (в котором проверять это условие) не подходит. Так как серия select-ов выполняется моментально, условие выполняется и затем все равно идет серия insert-ов.
Ошибка на фразе "срия select-ов выполняется моментально". Каждый селект будет выполняться ПОСЛЕДОВАТЕЛЬНО, при условии лока таблиц на чтение для инсерта. И ничего не выполнится моментально, все будет по порядку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы