LINUX.ORG.RU

История изменений

Исправление 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`

Под нагрузкой пока не проверял, но выглядит неплохо. Может кому пригодится.