Hello Matze,
Ich habe in einer Datenbank meine Datensätze, nun wird über eine Eingabemaske der Datensatz Nr.1 aufgerufen, dieser wird in einem Formular angezeigt. Dort hat man die Möglichkeit diesen zu ändern. Jetzt wird dieser mit update über den alten Datensatz geschrieben.
Jetzt die Frage, gibt es eine einfache Möglichkeit den Datensätze zu vergleichen, um ihn erst zu speichern wenn auch wirklich eine Änderung vorgenommen wurde?
Das tun die Datenbankmanagementsysteme meistens schon von ganz alleine, was aber dann ggf. später zu einem False Positive führen kann, wenn Du die Auswertung der Operation nicht genau durchdenkst.
Viel wesentlicher in einem Internetsystem ist meistens die Konkurrenzsituation zwischen den Usern.
Üb das am allerbesten einfach mal an einer einfachen Textdatei, die in einer Textarea angezeigt wird und dort vom User veränsert und wieder abgespeichert werden kann. Stell Dir das Szenario vor, wenn z.B. drei User die Seite aufrufen (die Textbox "laden"), sich eine Weile den Text darin ansehen, jeder an einer anderen Stelle Veränderungen vornehmen und dann den gänderten Text zurückspeichern.
Du benötigst für diesen Fall einen Lockingmechanismus. Im Web (verbindungslose Client-Server-Applikation) wird der passende immer wieder gerne total vergessen. Ich habe ihm daher vor Jahren schon einen Sptznamen gegeben "Academic Locking". Das soll bedeuten, dass ein optimistic-Locking-Verfahren benutzt wird, das auch mit "akademischer Verspätung" = "ct" noch funktioniert.
Es wird also nicht wirklich der Datensatz gesperrt, sondern ein Semaphor des Datensatzes mit ausgelesen. Dieses muss vor dem (beim) Zurückspeichern noch übereinstimmen. Direkt im Speichervorgang wird es jedoch geändert, z.B. einfach ein Zähler heraufgezählt.
Für die Sicherheit sinnvoll ist es, wenn dem Client das Semaphor nicht im Klartext übermittelt wird, sondern dieses entweder als Hash übermittelt wird, oder aber das Semaphor nur in der API (Session) gespeichert wird.
Das Update-Statement muss demnach in ihrer where-clause auch die Übereinstimmung des Semaphors überprüfen. Stimmt dieses nicht mehr überein, sollte nach Möglichkeit eine Exception mit eineindeutiger Fehlernummer ausgelöst werden. DBMS, die das noch nicht können, können aber häfig schon stored Procedures. Leider können die auch noch nicht immer gezielt Exceptions auslösen...
Aber wenn wir noch warten, wird MySQl das auch eines Tages können :-D
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg