Être première ligne débloquée dans MYSQL
-
20-09-2019 - |
Question
Quand quelqu'un visite mon site, il verra la page avec le plus petit nombre de pages vues. Toutes les pages, y compris un compteur PageView, sont stockés dans une base de données MYSQL. Si une page est affichée, le compteur est augmenté pageview par un.
Je courir maintenant dans une condition de course si le serveur web a plus d'un thread:
Discussion 1: l'utilisateur A récupère la page P avec 10 pageview nombre
Discussion 2: l'utilisateur B retreives pI avec 10 pageview nombre
Discussion 1: Nombre de page Pageview P est passé de 10 à 11 et sauvé
Discussion 2: Nombre de page Pageview P est passé de 10 à 11 et sauvé
Ainsi, à la fin, la page a été vue deux fois, mais le PageCounter n'est augmentée par un.
Une solution est de bloquer la ligne en utilisant SELECT ... FOR UPDATE mais alors, l'utilisateur B doit attendre jusqu'à ce que l'enregistrement d'utilisateur A accède est enregistré et avec beaucoup de fils tout en essayant d'obtenir la page avec le plus petit nombre Pages vues , il y aura un délai.
Ma question: est-il possible quand un certain nombre de lignes sont verrouillés, pour obtenir la première ligne qui est pas verrouillé, de sorte que les fils ne doivent pas attendre les uns des autres Comment faire cela en MYSQL?
Je préférerais une solution qui se traduit par:
Discussion 1: L'utilisateur verrouille une page P avec 10 pageview nombre
Discussion 2: L'utilisateur verrouille B la page Q avec 11 nombre pageview (parce que la page P est verrouillé)
Discussion 1: Nombre de page Pageview P est passé de 10 à 11 et sauvé
Discussion 2: Nombre de page Pageview Q est passé de 11 à 12 et sauvé
La solution
Je suppose que vous faites quelque chose comme ceci:
UPDATE Pages SET PageView = 11 WHERE Id = 30
où les constantes 11 et 30 sont insérées par votre code (PHP?)
Une meilleure façon est de faire ceci:
UPDATE Pages SET PageView = PageView + 1 WHERE Id = 30
Ensuite, vous ne devriez pas besoin de verrouiller les lignes à travers plusieurs requêtes afin que le problème que vous voulez résoudre disparait.