Frage

Wenn jemand Besucher meiner Website, er die Seite mit den wenigsten Seiten sehen. Alle Seiten, einschließlich der Seitenzugriff Zähler werden in einer MySQL-Datenbank gespeichert. Wenn eine Seite angezeigt wird, wird der Seitenaufruf Zähler um eins erhöht.

ich jetzt in einen Racing Zustand ausgeführt werden, wenn mein Webserver mehr als ein Thread hat:

  

Thread 1: User A abruft Seite P mit Seitenzugriff Zahl von 10
  Thema 2: Benutzer B retreives Seite P mit Seitenzugriff Zahl von 10
  Thema 1: Pageview Anzahl der Seite P erhöht von 10 auf 11 und gespeichert
  Gewinde 2: Pageview Anzahl der Seite P erhöht von 10 auf 11 und gespeichert

So am Ende wurde die Seite zweimal gesehen, aber der Pagecounter nur um eins erhöht wird.

Eine Lösung ist die Zeile zu sperren, indem Sie eine SELECT mit ... FOR UPDATE aber dann hat der Benutzer B warten, bis der Rekord Benutzer A greift gespeichert und mit vielen Threads alle versuchen, die Seite mit den wenigsten Seitenzugriffe zu bekommen , wird es eine Verzögerung geben.

Meine Frage: ist es möglich, wenn eine Anzahl von Zeilen gesperrt ist, die erste Zeile zu erhalten, die nicht gesperrt ist, so dass die Fäden auf sich nicht warten müssen Wie zu tun dies in MYSQL?

Ich würde eine Lösung, die Ergebnisse in bevorzugen:

  

Gewinde 1: Benutzer A Schlösser Seite P mit Seitenzugriff Zahl von 10
  Gewinde 2: Benutzer B sperrt Seite Q mit Seitenzugriff Zahl von 11 (weil Seite P ist gesperrt)
  Thema 1: Pageview Anzahl der Seite P erhöht von 10 auf 11 und gespeichert
  Gewinde 2: Pageview Anzahl der Seite Q erhöht von 11 bis 12 und gespeichert

War es hilfreich?

Lösung

Ich glaube, Sie so etwas wie dies tun:

 UPDATE Pages SET PageView = 11 WHERE Id = 30

wobei die Konstanten 11 und 30 durch den Code eingefügt werden (PHP?)

Ein besserer Weg, dies zu tun:

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

Dann sollten Sie nicht brauchen, um die Zeilen über mehrere Abfragen zu sperren, damit das Problem, das Sie wollen schwindet lösen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top