Получить первую разблокированную строку в MYSQL
-
20-09-2019 - |
Вопрос
Когда кто-то посещает мой сайт, он увидит страницу с наименьшим количеством просмотров.Все страницы, включая счетчик просмотров, хранятся в базе данных MYSQL.Если страница просматривается, счетчик просмотров страниц увеличивается на единицу.
Теперь я сталкиваюсь с состоянием Racing, если на моем веб-сервере более одного потока:
Тема 1:Пользователь A получает страницу P с количеством просмотров страниц, равным 10.
Тема 2:Пользователь Б получает страницу P с количеством просмотров страниц 10.
Тема 1:Количество просмотров страницы P увеличено с 10 до 11 и сохранено.
Тема 2:Количество просмотров страницы P увеличено с 10 до 11 и сохранено.
Итак, в конце страница была просмотрена дважды, но счетчик страниц увеличился только на единицу.
Решение состоит в том, чтобы заблокировать строку с помощью SELECT...Однако для ОБНОВЛЕНИЯ пользователь B должен ждать, пока запись, к которой обращается пользователь A, не будет сохранена, и поскольку многие потоки пытаются получить страницу с наименьшим количеством просмотров страниц, произойдет задержка.
Итак, мой вопрос:возможно ли, когда несколько строк заблокированы, получить первую незаблокированную строку, чтобы потокам не приходилось ждать друг друга? Как это сделать в MySQL?
Я бы предпочел решение, которое приводит к:
Тема 1:Пользователь А блокирует страницу P с количеством просмотров страниц, равным 10.
Тема 2:Пользователь Б блокирует страницу Q с количеством просмотров страниц, равным 11 (поскольку страница P заблокирована)
Тема 1:Количество просмотров страницы P увеличено с 10 до 11 и сохранено.
Тема 2:Количество просмотров страницы Q увеличено с 11 до 12 и сохранено.
Решение
Я думаю, вы делаете что-то вроде этого:
UPDATE Pages SET PageView = 11 WHERE Id = 30
где константы 11 и 30 вставлены вашим кодом (PHP?)
Лучший способ сделать это:
UPDATE Pages SET PageView = PageView + 1 WHERE Id = 30
Тогда вам не нужно будет блокировать строки для нескольких запросов, чтобы проблема, которую вы хотите решить, исчезла.