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é

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top