Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Надо сделать проверку и запись в таблицу tab_size, заблокировав предварительно её?!

Quatrix Мыслитель (5437), закрыт 5 лет назад
Ситуация упрощенная, в реальности немного посложней: есть таблица tab_size с полями id, size. Два пользователя одновременно могут отправить запрос на бронирование размера. Мне надо проверить в таблице чтобы не было этого размера и тогда его добавить. Если размер есть, то бронь не проходит. Т. е. вот юзер 1 отправляет запрос SELECT COUNT(*) FROM tab_size WHERE size=45, если размера нет записываю в таблицу размер INSERT INTO tab_size (size) VALUES (45), но перед записью 2ой пользователь успел сделать запрос, получил ответ что нет размера и тоже его записал в БД. В итоге 2 записи с одинаковым размером. Как решить такую ситуацию?
Лучший ответ
李西青 Просветленный (42546) 5 лет назад
вариант 1:
делаешь уникальный ключ по size
и вместо проверки select пользователь делает insert
если ловит исключение, значит там уже кто-то есть. Если не ловит - значит успешно вставился.

вариант 2:
тривиальные блокировки
http://www.mysql.ru/docs/man/LOCK_TABLES.html
сделали select, поняли что надо вставлять
lock tables tab_size write;
повторыный select, проверили что никто не успел до нас
insert ...
unlock ...
QuatrixМыслитель (5437) 5 лет назад
вариант 1 не прокатит, потому что там немного сложней;) а вот 2-ой то что надо походу, сейчас проверю
Остальные ответы
Jurijus Zaksas Искусственный Интеллект (425086) 5 лет назад
Поставить уникальный индекс на поле размера или на оба поля сразу - мне отсюда твоя бизнес-логика не видна. Тогда один из пользователей получит по рукам.
Похожие вопросы