Когда кто-то заходит на мой сайт, он увидит страницу с наименьшим количеством просмотров. Все страницы, включая счетчик просмотров, хранятся в базе данных 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 и сохранено