История изменений
Исправление blind_oracle, (текущая версия) :
В общем, учитывая что SELECT-ов планируется много больше чем INSERT-ов, была придумана такая схема:
- Проверяем есть ли запись в таблице: SELECT `id` FROM `table` WHERE `name` = 'Vasya'
- Если есть - всё хорошо, забираем id, уходим
- Если нет - блокируем таблицу: LOCK TABLES `table` WRITE
- Ещё раз проверяем есть ли там запись тем же запросом (она могла появиться между селектом и блокировкой)
- Если появилась - всё хорошо, забираем id, разблокируем таблицу
- Если нет - вставляем новую запись, забираем id
- Разблокируем таблицу: UNLOCK TABLES `table`
Под нагрузкой пока не проверял, но выглядит неплохо. Может кому пригодится.
Исходная версия blind_oracle, :
В общем, учитывая что SELECT-ов планируется много больше чем INSERT-ов, была придумана такая схема:
- Проверяем есть ли запись в таблице: SELECT `id` FROM `table` WHERE `name` = 'Vasya'
- Если есть - всё хорошо
- Если нет - блокируем таблицу: LOCK TABLES `table` WRITE
- Ещё раз проверяем есть ли там запись тем же запросом (она могла появится между селектом и блокировкой)
- Если появилась - всё хорошо, забираем id, разблокируем таблицу
- Если нет - вставляем новую запись, забираем id
- Разблокируем таблицу: UNLOCK TABLES `table`
Под нагрузкой пока не проверял, но выглядит неплохо. Может кому пригодится.