Ankündigung

Einklappen
Keine Ankündigung bisher.

MySql abfragen durcheinander?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySql abfragen durcheinander?

    hallo...
    ich habe mal eine frage...
    ich habe ein kleines spiel mit php programmiert.
    wenn ein user nun z.b. eine bestimmte aktion im spiel durchführt,
    greife ich auf die db zu, hole daten, verändere diese und update die db wieder. wenn nun aber mehrere user diese aktion durchführen, kann es da sein, das die db durcheinander gerät, oder stellen sich die abfragen wie in
    einer schlange hinter einander an?

    also zb: durch einen klick auf einen button wird folgendes automatsich gemacht:
    eine zeile der db sieht so aus: "0,0,0,0,0,0"
    user1 holt sich die daten, sie werden automatisch zu "0,1,0,0,0,0" verändert und wieder geupdatet. alles durch einen klick...

    wenn nun aber user2 dazwischen funkt und gleichzeitig klickt und die daten holt bevor user1 sie abspeichern konnte und hat also auch noch den ursprungsstring "0,0,0,0,0,0" und bei ihm wird es zu "0,0,0,1,0,0"...
    dann würde er es ja auch so abspeichern und in der db würde "0,0,0,0,1,0" stehen anstatt "0,1,0,0,1,0,"...

    ich hoffe das schnallt jemand!?

  • #2
    Du könntest die Datenbank solang sperren. Das Schlagwort dürfte LOCK sein.

    Kommentar


    • #3
      aha, wenn ich das nicht tue könnte also was durch ein ander geraten?

      finde ich irgendwo eine beschreibung zu "LOCK" im netz?

      Kommentar


      • #4
        wenn ich nun z.b. aus:

        $holdiedaten = mysql_query("SELECT * FROM tabelle1");
        while($row = mysql_fetch_array($holdiedaten)){
        $id=$row[id];$text=$row[text];
        }
        ...$text wird automatisch modifiziert...
        $aendern = "UPDATE tabelle1 Set text = '$text' WHERE id = '$id'";
        $update = mysql_query($aendern);

        folgendes machen würde:

        mysql_query("LOCK TABLES tabelle1 WRITE");
        $holdiedaten = mysql_query("SELECT * FROM tabelle1");
        while($row = mysql_fetch_array($holdiedaten)){
        $id=$row[id];$text=$row[text];
        }
        ...$text wird automatisch modifiziert...
        $aendern = "UPDATE tabelle1 Set text = '$text' WHERE id = '$id'";
        $update = mysql_query($aendern);
        mysql_query("UNLOCK TABLES tabelle1");

        wäre dann mein problem gelöst?
        und was ist nun bei gleichzeitigem aufruf des scripts zweier user?
        wartet der eine dann automatisch kurz oder bekommt er ne fehlermeldung,
        das auf die db nicht zugegriffen werden kann?

        Kommentar


        • #5
          Hi,

          Du kannst davon ausgehen, dass die Daten nicht durcheinander kommen.
          SQL-Anfragen werden in der Reihenfolge abgearbeitet, in der sie an die DB gesendet werden.

          Bei Dingen, die nur Bedingt Änderungen sein sollen, so zB. Löschen eines Objektes und seiner Abhängigkeiten in verschiedenen Tables empfiehlt sich eine Transaktion.
          Ein Transaktion ist atomar. dh. Innerhalb einer Transaktion werden alle querys ausgeführt, ohne das eine andere Transaktion dazwischenfunken kann.

          Geht was schief ist keines der Querys ausgeführt, gehts glatt sind alle durch.

          Für mySQL funktionieren Transaktionen bei der InnoDB, nicht by myISAM(standart). Dafür ist InnoDB auch langsamer.

          Eine zweite möglichkeit sind Trigger oder Rules. Das heißt, wenn ein Datensatz gelöscht wird, kann man einstellen, dass DB-Seitig abhängige Datensätze der selben oder anderer Tables automatisch gelöscht werden.

          Ich würd mir überlegn ob ich das Problem nicht durch irgendeine elegante Logic umgehen kann. Oder ob es exestentiell für die Anwendung ist, denn of wird es einfach nicht gebraucht.

          Gruß
          Der Desian
          Wenn dich was ankotzt, machs besser.

          Kommentar


          • #6
            mmm, so richtig hab ich es nicht verstanden..

            egal, aber wenn ich was lese, dann verändere und dann wieder speicher und mir soll da niemand dazwischen funken, kann ich das so handhaben?:

            mysql_query("LOCK TABLES tabelle1");
            lesen...
            verändern...
            schreiben...
            mysql_query("UNLOCK TABLES tabelle1");

            oder ist das falsch?
            p.s. was ist wenn ich mal das UNLOCK vergesse, wie lang ist die db denn dann unlocked?

            Kommentar


            • #7
              3 Jahre.

              Kommentar


              • #8
                blödmann

                Kommentar


                • #9
                  Spaß muß sein
                  Aber:
                  Transaktionen macht man so:

                  $query = 'BEGIN'; // Ja es heißt wirklich begin
                  $query = 'SELECT INSERT UPDATE ..bla';
                  $query = 'COMMIT';
                  (Ausführen noch, natürlich)

                  Alles was zwishen BEGIN und COMMIT steht wird unteilbar geschehen.

                  Stolpersteine:
                  Transaktionen funktionieren nicht mit der Standarteistellung von mySQL (myISAM).
                  Man muß/kann den dbType ändern.. in InnoDB
                  mySQL hat ein normalerweise ein Aotocommit, das nach jedem Statement ausgeführt wird. das muß man ausschalten.
                  Schlicht mit: AUTOCOMMIT OFF

                  Ganz genau beschrieben ist es hier.

                  Gruß
                  Der Desian
                  Wenn dich was ankotzt, machs besser.

                  Kommentar


                  • #10
                    aha...

                    und was passiert, wenn ein user gerade eine tabelle updaten möchte wenn ein anderer gerade in dieser

                    $query = 'BEGIN'; // Ja es heißt wirklich begin
                    $query = 'SELECT INSERT UPDATE ..bla';
                    $query = 'COMMIT';

                    schleife steckt? bekommt der dann ne fehlermeldung oder wartet php kurz und stellt sich "hinten an"?

                    Kommentar


                    • #11
                      Stellt sich hinten an.
                      Und wenns ein Timeout gibt (keine Ahnung wie lange) gibts halt beim 2ten User ne Fehlermeldung.

                      Die Transaktionen sind dazu gedacht, dass dem DB-User die lästigen Sperrverfahren, die man im Studium pauken muß abgenommen werden.
                      Das macht halt die Transaktion.

                      Gruß
                      Der Desian
                      Wenn dich was ankotzt, machs besser.

                      Kommentar


                      • #12
                        aha... super... genau das suchte ich

                        wenn ich jetzt meine db umstelle auf "InnoDB" wird an der tabelle nix verändert, also es gehen keine daten verloren oder?

                        dann mache ich das folgender maßen:

                        AUTOCOMMIT OFF;
                        $query = 'BEGIN';
                        $query = 'SELECT INSERT UPDATE ..bla';
                        $query = 'COMMIT';
                        (Ausführen noch, natürlich) << was genau meinst du damit?

                        und dann sollte das klappen?

                        Kommentar


                        • #13
                          könnte mir noch mal kurz jemand sagen, ob ich da mit meiner annahme richtig liege?

                          Kommentar


                          • #14
                            könnte mir noch mal kurz jemand sagen, ob ich da mit meiner annahme richtig liege?

                            Kommentar


                            • #15
                              Mit 'Ausführen' mein ich , dass du die Querys di ich da geschrieben hab noch an die DB schicken mußt via
                              PHP-Code:
                              <?php
                              mysql_query
                              ($dbConnection$query);
                              ?>
                              War also nur eine FormAnsage von mir um dich zu verwirren

                              Bei der Umstellung ändert sich (fast) nix.
                              Daten und Strucktur bleiben gleich.
                              Nur wie Daten und Strucktur 'angefasst' werden ändert sich.

                              Genaueres über die Tabellentypen kann man auch hier nachlesen.

                              Gruß
                              Der Desian
                              Wenn dich was ankotzt, machs besser.

                              Kommentar

                              Lädt...
                              X