Получить первую разблокированную строку в MYSQL - PullRequest
1 голос
/ 14 января 2010

Когда кто-то заходит на мой сайт, он увидит страницу с наименьшим количеством просмотров. Все страницы, включая счетчик просмотров, хранятся в базе данных MYSQL. Если страница просматривается, счетчик просмотров увеличивается на единицу.

Теперь я нахожусь в состоянии Racing, если мой веб-сервер имеет более одного потока:

Тема 1: Пользователь A получает страницу P с количеством просмотров страницы 10
Тема 2: Пользователь B получает страницу P с количеством просмотров страницы 10
Тема 1: Количество просмотров страницы P увеличено с 10 до 11 и сохранено
Тема 2: Количество просмотров страницы P увеличено с 10 до 11 и сохранено

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

Решение состоит в том, чтобы заблокировать строку с помощью SELECT ... FOR UPDATE, однако тогда пользователь B должен дождаться сохранения записи, к которой обращается пользователь A, и со многими потоками, которые пытаются получить страницу с наименьшим количеством просмотров. , будет задержка.

Итак, мой вопрос: возможно ли заблокировать несколько строк, чтобы получить первую строку, которая не заблокирована, поэтому потоки не должны ждать друг друга? Как это сделать? в MYSQL?

Я бы предпочел решение, которое приведет к:

Тема 1: пользователь A блокирует страницу P с количеством просмотров страницы 10
Поток 2: Пользователь B блокирует страницу Q с количеством просмотров страниц 11 (потому что страница P заблокирована)
Тема 1: Количество просмотров страницы P увеличено с 10 до 11 и сохранено
Тема 2: Количество просмотров страницы Q увеличено с 11 до 12 и сохранено

1 Ответ

1 голос
/ 14 января 2010

Полагаю, вы делаете что-то вроде этого:

 UPDATE Pages SET PageView = 11 WHERE Id = 30

где константы 11 и 30 вставляются вашим кодом (PHP?)

Лучший способ сделать это:

 UPDATE Pages SET PageView = PageView + 1 WHERE Id = 30

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

...