MySQL + PHP обновление/добавление записей в БД SELECT + UPDATE/INSERT = дубликаты

157
17 октября 2018, 23:50

У меня есть некий кусок кода для обновления/добавления записи в БД который выбирает запись из БД SELECT-ом, и если она есть - делает UPDATE, если нет - INSERT.

Проблема в следующем: если зафлудить скрипт (вызвать через мерную нагрузку), то начинают появляться дубликаты записей. Т.е. как я понимаю, SELECT-ы как-то группируются и кэшируются что-ли?

Кто может объяснить такое поведение?

Понятно, что добавив уникальное значение в таблицу, можно избежать дубликаты, но по Т.З. уникальным полем для обновления данных - может выступать любое поле в ходе обращения к скрипту.

Данная проблема возникла на конкретном рабочем проекте, но для теста я смог ее воспроизвести в помощью скрипта: https://pastebin.com/BjR8tXzC и ab-тестером:

ab -n 1000 -c 10 http://site.com/test-overload.php

Тестовая таблица (SHOW CREATE TABLE test_overload;):

CREATE TABLE `test_overload` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `code` int(11) unsigned NOT NULL DEFAULT '0',
 `data` text NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

Возможно ли как-то изменить поведение, чтоб не появлялись дубликаты? (кроме INSERT ... ON DUPLICATE KEY UPDATE ...) Может настройка MySQL ?

READ ALSO
Баланс и хранение баланса в файле [закрыт]

Баланс и хранение баланса в файле [закрыт]

Как сделать баланс и хранить его не в базе данных, а в файле?

181
Как исправить ошибку Notice: Undefined index: userfile при загрузке файла

Как исправить ошибку Notice: Undefined index: userfile при загрузке файла

Добавляю форму загрузки файла в свой скрипт, но настранице с формой отображается ошибка

180
Как запустить крон в laravel 2 раза в день?

Как запустить крон в laravel 2 раза в день?

Запустил серверНаписал скрипт, который нужно выполнять два раза в день(утром и вечером)

154
php+mysql: Подсчитать количество вхождений каждого символа в базе

php+mysql: Подсчитать количество вхождений каждого символа в базе

Есть таблица БД с текстовыми полями ~30млнзаписей UTF-8

165