Kuno: LOCK für mysql

Wie kann ich eine MYSQL-Datenbank locken?

  1. echo $begrüßung;

    Wie kann ich eine MYSQL-Datenbank locken?

    Gehe auf die Seite von MySQL, gib in das Suchfeld "lock" ein, und du findest die Antwort auf deine Frage in wenigen Sekunden.

    echo "$verabschiedung $name";

  2. Hallo Kuno,

    Wie kann ich eine MYSQL-Datenbank locken?

    Das steht im Handbuch.

    Was willst Du erreichen?
    Was hast Du versucht?
    Wo bist Du hängengeblieben?

    Vinzenz

    1. Ich habe ein Web-Formular! Manchmal kommt es vor, dass wenn jemand extrem schnell und mehrmals hintereinander auf den SUBMIT-Button klickt, dass dann ein Datensatz zweimal vorkommt (außer AUTO INCREMENT)

      1. echo $begrüßung;

        Ich habe ein Web-Formular! Manchmal kommt es vor, dass wenn jemand extrem schnell und mehrmals hintereinander auf den SUBMIT-Button klickt, dass dann ein Datensatz zweimal vorkommt (außer AUTO INCREMENT)

        Dabei hilft dir ein Locking nicht weiter. Der Client setzt zwei Requests ab. Der zweite wartet dann bis das Locking vom ersten Request beendet ist und trägt dann seinen Datensatz ein. Du musst verhindern, dass der Client zwei Request absetzen kann oder dass der zweite Request bearbeitet wird. Clientseitig kann man versuchen, das mittels Javascript zu verhindern. Nach Absenden des Formulars kann man den Submit-Button disablen. Serverseitig kann man das beispielsweise verhindern, indem dem Formular ein eindeutiger Einmal-Wert mitgegeben wird. Dieser wird z.B. in einer Session gespeichert. Kommt ein zweiter Request mit dem gleichen Wert, kann er ignoriert werden.

        echo "$verabschiedung $name";

      2. Hello,

        Ich habe ein Web-Formular! Manchmal kommt es vor, dass wenn jemand extrem schnell und mehrmals hintereinander auf den SUBMIT-Button klickt, dass dann ein Datensatz zweimal vorkommt (außer AUTO INCREMENT)

        Dafür ist Lock nicht gedacht.
        Die zwei Klicks erzeugen außerdem sowieso zwei Connections.
        Locks von einer Connection zur nächsten zu tragen, ist nicht ohne weiteres möglich und außerdem "gefährlich". Lost Locks würden Dir nämlich die DB lahmlegen.

        Der richte Weg wäre die Verwendung der Request-Ident-Nummer im Formular.
        Speichere diese mit ab und mache sie in der DB Unique. Dann kann sie ja nur einmal abgeichert werden und jeder zweite Versuch würde zu einem Fehler führen, der auswertbar ist.

        Du findest die Nummer unter $_SERVER["UNIQUE_ID"]

        Die wird bei jedem Request neu generiert. Du brauchst sie also nur mit auszugeben und dann in der Datenbank ablegen. Wenn Du es noch besser machen willst, trägst Du sie beim Senden des Formulares auch in die Session ein. Wenn Sie beim Rücksenden nicht passt, hat jemand gemogelt...

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

  3. Hello,

    Wie kann ich eine MYSQL-Datenbank locken?

    Mit dem entsprechenden SQL-Statement
    http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html
    und den entsprechenden Rechten zur Nutzung des Statements.

    Außerdem muss mann bei MySQL nicht immer gleich die ganze Tabelle sperren, sondern es reicht meistens ein Datensatz.

    Locking-Strategien für verbindungslose Protokolle sind aber wesentlich komplexer.
    Man arbeitet da meistens mit einem Conlict Counter und "Optimistischem Locking".
    Das bedeutet, dass der Satz erst dann gesperrt wird, wenn die Änderung vorgenommen werden soll. Das ist bei MySQL aber gar nicht notwendig, weil jedes Statement atomar gekapselt abgewickelt wird.
    Der Conflict Zähler ist einfach ein zusätzliches Datenbankfeld, dass bei jedem Update heraufgezählt wird. Zählen ist sicherer als ein Timestämp, denn der könnte auf schnellen Systemen zu granular sein! Wenn der Timestamp sich dann zwischen dem Holen der Daten und dem Wegschreibversuch geändert hat, ist dieser ja erfolglos.

    Update TABELLE where ID = $id and counter = $counter set ...

    Um herauszufinden, obbes am Counter oder der ID gelegen hat, kann man den Datansatz dann ggf. nochmals holen lassen.

    Notwendig ist ein Locking eher für Satzgruppen, die durch mehrere __innerhalb__einer__Verbindung__ liegende Statements abhängig voneinander geändert werden sollen.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau