Странный глюк с медленным сервером

SkisoR

Новичок
Странный глюк с медленным сервером

В связи с паранормальными ошибками mysql появился вопрос:
- При одновременных запросах к базе, они выполняются параллельно или выстраиваются в очередь?

Ситуация такая:
- Регистрация пользователей. Идет проверка наличия в базе введенного мыла, и если нету то INSERT записи с новым мылом. И вот, если на тормознутом серваке два раза подряд нажать кнопку "зарегистрироваться", то майскюел пишет ошибку Duplicate entry (мыло - UNIQUE).

Как такое может быть и что делать?

$query = mysql_query("SELECT 1 FROM `users` WHERE `email`=".$email." LIMIT 1");
if (mysql_num_rows($query) > 0)
{
return 'email_exists_already';
}
else
{
mysql_query("INSERT INTO `users`(`email`) VALUES (".$email.")");
}
 

Апокалипсис

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

MadMike

Новичок
Как дети. "Переустановка таблицы", "insert ignore".
Сразу видно, что Апельсинка в отпуске :)

В общем, суть в том, что MyISAM ставит лок на всю таблицу при инсерте/апдейте/делите. Соответственно, при нагруженном сервере хостера получаем, что запрос висит долго, а табличка залочена. После снятия лока второй запрос проходит, и получает вполне логичную ошибку "duplicate entry" - первая запись уже вставлена.

"Переустановка таблицы" - это надо запомнить, интересная фраза. Даже интереснее, действительно ли после этого ошибка пропала? :)))

INSERT IGNORE - хороший выход, можно считать, что "кто последний - тот и папа", тому и пароль говорить :)

ЗЫ. Запросы выполняются параллельно, но далеко не все ;)
 
Сверху