kostenloser Webspace werbefrei: lima-city


Mysql - Gleichzeitiger Zugriff

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    gamesite

    gamesite hat kostenlosen Webspace.

    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.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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.
  4. Autor dieses Themas

    gamesite

    gamesite hat kostenlosen Webspace.

    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
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Du könntest ein Lock bauen
  6. Autor dieses Themas

    gamesite

    gamesite hat kostenlosen Webspace.

    hackyourlife schrieb:
    Du könntest ein Lock bauen...
    OK, und was macht man, wenn die Zeile gerade gesperrt ist?
    -Warten?
    -Fehlermeldung?
  7. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    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 ...
  8. Autor dieses Themas

    gamesite

    gamesite hat kostenlosen Webspace.

    Gut, ich würde es einfach kurz später nochmal versuchen, also mit usleep().

    Angenommen, mein Programm braucht 4000 Mikrosekunden von sperren bis entsperren.
    In welchem Takt ist es dann sinnvoll nachzuprüfen, ob die Zeile schon frei ist?
  9. 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.


  10. Autor dieses Themas

    gamesite

    gamesite hat kostenlosen Webspace.

    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?
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!