2 Stimmen

Erste freigeschaltete Zeile in MYSQL abrufen

Wenn jemand meine Website besucht, wird er die Seite mit den wenigsten Seitenaufrufen sehen. Alle Seiten, einschließlich eines Seitenaufrufzählers, werden in einer MYSQL-Datenbank gespeichert. Wenn eine Seite aufgerufen wird, wird der Seitenaufrufzähler um eins erhöht.

Ich stoße jetzt auf eine Racing-Bedingung, wenn mein Webserver mehr als einen Thread hat:

Thema 1: Benutzer A ruft die Seite P mit einer Seitenaufrufzahl von 10 auf
Thema 2: Benutzer B ruft die Seite P mit einer Seitenaufrufzahl von 10 auf.
Thema 1: Die Anzahl der Seitenaufrufe der Seite P wird von 10 auf 11 erhöht und gespeichert
Thema 2: Die Anzahl der Seitenaufrufe der Seite P wird von 10 auf 11 erhöht und gespeichert

Am Ende wurde die Seite also zweimal aufgerufen, aber der Seitenzähler wird nur um eins erhöht.

Eine Lösung besteht darin, die Zeile mit einem SELECT ... FOR UPDATE zu sperren. Allerdings muss Benutzer B dann warten, bis der Datensatz, auf den Benutzer A zugreift, gespeichert ist, und bei vielen Threads, die alle versuchen, die Seite mit den wenigsten Seitenaufrufen zu erhalten, kommt es zu einer Verzögerung.

Also meine Frage: ist es möglich, wenn eine Reihe von Zeilen gesperrt sind, um die erste Zeile, die nicht gesperrt ist, zu erhalten, so dass die Threads nicht auf einander warten müssen? Wie macht man das in MYSQL?

Ich würde eine Lösung bevorzugen, die zu folgenden Ergebnissen führt:

Thema 1: Benutzer A sperrt die Seite P mit einem Seitenaufruf von 10
Thema 2: Benutzer B sperrt die Seite Q mit einem Seitenaufruf von 11 (weil Seite P gesperrt ist)
Thema 1: Die Anzahl der Seitenaufrufe der Seite P wird von 10 auf 11 erhöht und gespeichert
Thema 2: Die Anzahl der Seitenaufrufe der Seite Q wird von 11 auf 12 erhöht und gespeichert

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X