LINUX.ORG.RU

Сбоит проверка на дубликат в SQL-базе при двух последовательных запросах на добавление.

 , ,


0

1

PHP скрипт при загрузке страницы, проверяет есть ли уже запись в БД, содержащая данную строку и если нет, добавляет. Проблема в том что в одном случае из нескольких тысяч, эта проверка не работает. Система в основном используется на мобильных телефонах через WiFi. Видимо пользователь не дожидается загрузки страницы и обновляет ее или это делает браузер автоматически.

Нужно как-то исключить создание двойников.

★★★★★

проверяет есть ли уже запись в БД, содержащая данную строку и если нет, добавляет

Возможно, есть способ делать проверку и добавление одним запросом. Тогда проблема исчезнет, БД обеспечит атомарность операции.

sholom
()
Ответ на: комментарий от sholom

Спасибо. Попробуй.

tlx ★★★★★
() автор топика

PHP скрипт при загрузке страницы, проверяет есть ли уже запись в БД

Ну и костыли. Делаешь уникальный индекс и insert ignore (для mysql)

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)

выставь максимальный уровень изоляции транзакций (snapshot/serializable/..) в твоей базе данных, и выполняй «проверка+добавление» внутри транзакции

внутри транзакции нужно использовать sql команду, которая позволяет делать атомарный compare-and-swap. Например, начиная с postgresql 9.5 это INSERT ... ON CONFLICT DO NOTHING/UPDATE

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)

Всё в одной транзакции, если универсально, или создать в таблице нужный уникальный ключ на исключение двойников и пользоваться, например, таким запросом (MySQL):

insert into .. on duplicate key update ...

PHPFan
()
Ответ на: комментарий от PHPFan

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

tlx ★★★★★
() автор топика
Ответ на: комментарий от tlx

еще нужно отменять остановку скрипта в случае отмены загрузки 9ну если юзер жмет стоп скрипт все-равно дорабатывает а не прерывается0 погугли, это точно можно как-то в пхп, видел в исходниках онхпх лет 10 назад

anonymous
()

PHP скрипт при загрузке страницы, проверяет есть ли уже запись в БД, содержащая данную строку и если нет, добавляет.

Почему просто не выставить ограничение на уровне БД?

theNamelessOne ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.