Нужно ли мне блокировать таблицу MySQL при выполнении ВЫБОРА, за которым следует ВСТАВКА?

#mysql #locking #expressionengine

#mysql #блокировка #expressionengine

Вопрос:

Я не гуру базы данных, поэтому мне любопытно, необходима ли блокировка таблицы в следующих обстоятельствах:

  • У нас есть веб-приложение, которое позволяет пользователям добавлять записи в базу данных через HTML-форму
  • Каждая запись, добавляемая пользователем, должна иметь уникальный URL
  • URL-адрес должен быть сгенерирован «на лету» путем извлечения самого последнего идентификатора из базы данных, добавления одного и добавления его к вновь созданной записи
  • Приложение работает на ExpressionEngine (я упоминаю это только в том случае, если это облегчает понимание моей ситуации для тех, кто знаком с платформой EE)

Соответствующие столбцы БД (exp_channel_titles)

  • entry_id (первичный ключ, авто_инкремент)
  • url_title (должен быть уникальным)

Мое гипотетическое решение — требуется ли здесь блокировка таблицы?

Допустим, в таблице 100 записей, и каждая запись в таблице имеет url_title типа entry_1, entry_2, entry_3 и т.д., Вплоть до entry_100. Каждый раз, когда пользователь добавляет запись, мой скрипт будет делать что-то вроде этого:

  1. Запросите (ВЫБЕРИТЕ) таблицу, чтобы определить последний entry_id и присвоить его переменной $last_id
  2. Добавьте 1 к возвращаемому значению и присвоите сумму переменной $new_id
  3. ВСТАВЬТЕ новую запись, установив в поле url_title последней записи значение entry_$new_id (таким образом, 101-я запись в таблице будет иметь url_title entry_101)

Поскольку мои знания базы данных ограничены, я не знаю, нужно ли мне беспокоиться о блокировке здесь. Что, если тысяча человек попытаются добавить записи в базу данных в течение 10 секунд? Обрабатывает ли MySQL это автоматически, или мне нужно блокировать таблицу при добавлении каждой новой записи, чтобы убедиться, что каждая запись имеет правильный идентификатор?

Запуск на движке MyISAM, если это имеет значение.

Ответ №1:

Я думаю, вам следует рассмотреть один из двух подходов:

  • Используйте и AUTO_INCREMENT столбец для присвоения идентификатора
  • Переключение с MyISAM на механизм хранения InnoDB, который является полностью транзакционным, и обертывание ваших запросов в транзакцию

Комментарии:

1. @ James C, спасибо за ответ. Идентификатор уже является полем автоматического увеличения. Мы оба говорим об одном и том же столбце? Что касается вашего второго предложения, я не знаю, возможно ли это. Я использую ExpressionEngine, который по умолчанию использует движок MyISAM. Если бы было возможно переключаться, что означает «полностью транзакционный», и как бы я обернул свои запросы в транзакцию?