2010-01-14 2 views
1

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

я теперь работать в гоночном состояние, если мой веб-сервер имеет более чем одну нити:

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

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

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

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

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

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

ответ

1

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

UPDATE Pages SET PageView = 11 WHERE Id = 30 

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

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

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

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

+0

Это оставляет гораздо менее вероятную и менее важную проблему для трех посетителей, прибывающих одновременно, и всех, кто видит страницу P, когда по крайней мере один из них должен был видеть страницу Q. +1, хотя я ничуть. – Sparr

Смежные вопросы