Mysql - Gleichzeitiger Zugriff
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aufruf
aufrufen
bauen
bearbeitung
berechnung
code
ergebnis
fehlermeldung
http
nummer
sekunde
start
tabelle
takt
update
url
warten
zahl
zeile
zelle
-
Hallo,
ich hab in Mysql eine Tabelle, die eigentlich nur eine Zelle besitzt.
Zuerst wird der Inhalt ausgelesen.
Dann geschehen mit dem Wert komplizierte Berechnungen mit Schleifen usw. Diese sind hier stark vereinfacht (nur +7).
Als Letztes wird das Ergebnis wieder in die Tabelle geschrieben.
Ok, hier der Code:
<?php //Datenbankverbindung, Tabellenauswahl $sql='SELECT nummer FROM zaehlen;'; $erg=mysql_query($sql); $zeile=mysql_fetch_array($erg,MYSQL_ASSOC); $nummer1=$zeile['nummer']; //Berechnungen $nummer2=$nummer1+7; $sql="UPDATE zaehlen SET nummer=$nummer2;"; mysql_query($sql); echo "Wert von $nummer1 auf $nummer2 geändert."; ?>
Was passiert jetzt, wenn zwei Leute (nahezu) gleichzeitig die Seite aufrufen?
Folgendes Szenario:
Skript 1 liest die Zahl 0.
Skript 2 liest die Zahl 0.
Skript 1 schreibt die Zahl 7.
Skript 2 schriebt die Zahl 7.
Letztendlich wäre die Zahl dann nur einmal erhöht worden, obwohl die Seite zweimal aufgerufen wurde.
Auch wenn es unwahrscheinlich ist, ist dieses Szenario realistisch?
Und wenn ja, wie kann man es besser machen?
Ich hoffe, es kann jemand helfen. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Realistisch ist das nur, wenn du sehr viele User hast. Es ist beispielsweise bei Youtube zu sehen, wo der Zähler ab 301 Aufrufen ja eigentlich stehen bleibt. Aber manchmal auch bei 304 oder etwas mehr. Genau da siehst du dann gleichzeitige Aufrufe. Erklärt ist das in diesem Video:
Mit dem bessermachen ist das so eine sache. Ich würde einfach jeden Aufruf quasi wie in ein Protokoll in eine temporäre Aufruf Tabelle schreiben. Per Cronjob würde ich die dann z.B. alle 5 Minuten durchlaufen und dann zu dem eigentlichen Zähler addieren. So bist du sicher, dass wirklich alle Aufrufe gezählt werden und kannst sogar wenn du die IP Adresse mitspeicherst eine sehr Ressourcenschonende Reload Sperre realisieren. -
Naja, das Problem ist, dass das Ergebnis des vorherigen Skripts wieder der Ausgangswert für das nächste Skript ist.
Und das Skript soll nicht nur diese eine Zelle anpassen, sondern auch andere Aufgaben mit den beiden Zahlen erledigen.
Da ist es eben wichtig, dass sie schön nacheinander durchgeführt werden.
Die exakte Reihenfolge spielt weniger eine Rolle, aber der Server soll sich eben entscheiden und dann seine Wahl strikt einhalten, und nicht irgendwas dazwischen machen.
lg -
gamesite schrieb:
OK, und was macht man, wenn die Zeile gerade gesperrt ist?
-Warten?
-Fehlermeldung?
Da wir nicht wissen, was du mit deinem Skript genau machen wirst, und wie sich das auf andere User auswirkt (oder nicht), solltest doch du die Frage selbst am allerbesten beantworten können!? Aber ich wage zu behaupten, dass ein zweiter User, der das Skript ausführt, und eine Fehlermeldung bekommt "Du bist gerade nicht der einzige Besucher, die Datenbank wird von jemand anders genutzt" wohl nicht so schnell wiederkommen wird ... -
Teste doch zunächst wie lange eine DB-Bearbeitung dauert.
<?php //Datenbankverbindung, Tabellenauswahl $start = microtime(true); $sql='SELECT nummer FROM zaehlen;'; $erg=mysql_query($sql); $zeile=mysql_fetch_array($erg,MYSQL_ASSOC); $nummer1=$zeile['nummer']; //Berechnungen $nummer2=$nummer1+7; $sql="UPDATE zaehlen SET nummer=$nummer2;"; mysql_query($sql); $end = microtime(true) - $start; echo "Wert von $nummer1 auf $nummer2 geändert."; echo "Die Bearbeitung dauerte: $end Sekunden; ?>
Siehe Zeile 3 und 14.
-
Skript sagt:
Die Bearbeitung dauerte: 0.0148391723633 Sekunden
Und jetzt nochmal zu meiner Frage:
In welchem Takt ist es dann sinnvoll, zu prüfen, ob die Zeile wieder frei ist? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage