Получить первую разблокированную строку в MYSQL

StackOverflow https://stackoverflow.com/questions/2063012

  •  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

Тогда вам не нужно будет блокировать строки для нескольких запросов, чтобы проблема, которую вы хотите решить, исчезла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top