WiZdooM
Erfahrenes Mitglied
Hallo
Ich mache mir gerade Gedanken, wie ich Einmaligkeit garantieren kann.
In einem Formular wird aus der mySQL-DB eine Nummer ausgelesen und diese um 1 erhöht, sodaß eine fortlaufende Nummer besteht.
Jetzt läuft diese Nummer in zwei Bereichen. Einmal zwischen 200 000 und 300 000 und zwischen 700 000 und 800 000.
In folgendem Beispiel wird nur der Bereich 200k bis 300k betrachtet.
Es befinden sich zwei Benutzer im selben Formular, die kleinste gespeicherte Nummer der Datenbank ist 200000, d.h. zum Zeitpunkt an dem das Formular geladen wird, bekommen beide Benutzer 200001 angezeigt.
Jetzt füllt der Benutzer Eins das Formular aus und schickt es ab. Es wird validiert, evtl Fehler werden angezeigt, welche eine erneute Validierung nach der Korrektur zur Folge hat. Ist alles okay, bekommt Benutzer Eins eine Druckansicht. Mit dem Klick auf Ausdrucken werden die Daten aus diesem Formular dann in die Datenbank eingetragen. Gleichzeitig wird die neue Nummer (200 001) in die Datenbank geschrieben.
Benutzer Zwei ist ja auch noch auf dem Formular und bekommt wie Benutzer Eins ebenfalls die 200 001 angezeigt, da ja zum Zeitpunkt des Ladens der Seite die größte gespeicherte Nummer 200 000 war. Schickt nun Benutzer Zwei das Formular ab würde er ebenfalls 200 001 in die Datenbank eintragen.
Das gilt es auf jedenfall zu verhindern.
Ich habe mir nun überlegt, die Tabelle mit einem "LOCK TABLES %Tabellenname% WRITE" ab dem Zeitpunkt, an dem die Daten aus der Validierung weitergegeben werden, zu sperren und nach dem Eintrag wieder zu Entsperren. Versucht nun jemand seine Nummer einzutragen, während die Tabelle gesperrt ist, bricht ja die Ausführung des SQL-Befehls ab. Ich würde nun hergehen und in die Übersichtsseite ein Refresh der Nummer anordnen wenn eben dieses Event getriggert wird.
Ich sehe nur das Problem, dass - wenn sich ein Benutzer in der Übersicht befindet und den Browser schließt, dieser Lock nicht mehr aufgehoben wird und somit niemand mehr in die Tabelle schreiben kann.
Eine andere Möglichkeit ist wohl die Nutzung der UNIQUE-Deklaration einer Spalte. Ist es in dem Fall sinnvoller direkt dann auf die Uniqe-Deklaration aufzulaufen oder sollte ich hier mit lock/unlock arbeiten ? Was meint ihr ?
Ich mache mir gerade Gedanken, wie ich Einmaligkeit garantieren kann.
In einem Formular wird aus der mySQL-DB eine Nummer ausgelesen und diese um 1 erhöht, sodaß eine fortlaufende Nummer besteht.
Jetzt läuft diese Nummer in zwei Bereichen. Einmal zwischen 200 000 und 300 000 und zwischen 700 000 und 800 000.
In folgendem Beispiel wird nur der Bereich 200k bis 300k betrachtet.
Es befinden sich zwei Benutzer im selben Formular, die kleinste gespeicherte Nummer der Datenbank ist 200000, d.h. zum Zeitpunkt an dem das Formular geladen wird, bekommen beide Benutzer 200001 angezeigt.
Jetzt füllt der Benutzer Eins das Formular aus und schickt es ab. Es wird validiert, evtl Fehler werden angezeigt, welche eine erneute Validierung nach der Korrektur zur Folge hat. Ist alles okay, bekommt Benutzer Eins eine Druckansicht. Mit dem Klick auf Ausdrucken werden die Daten aus diesem Formular dann in die Datenbank eingetragen. Gleichzeitig wird die neue Nummer (200 001) in die Datenbank geschrieben.
Benutzer Zwei ist ja auch noch auf dem Formular und bekommt wie Benutzer Eins ebenfalls die 200 001 angezeigt, da ja zum Zeitpunkt des Ladens der Seite die größte gespeicherte Nummer 200 000 war. Schickt nun Benutzer Zwei das Formular ab würde er ebenfalls 200 001 in die Datenbank eintragen.
Das gilt es auf jedenfall zu verhindern.
Ich habe mir nun überlegt, die Tabelle mit einem "LOCK TABLES %Tabellenname% WRITE" ab dem Zeitpunkt, an dem die Daten aus der Validierung weitergegeben werden, zu sperren und nach dem Eintrag wieder zu Entsperren. Versucht nun jemand seine Nummer einzutragen, während die Tabelle gesperrt ist, bricht ja die Ausführung des SQL-Befehls ab. Ich würde nun hergehen und in die Übersichtsseite ein Refresh der Nummer anordnen wenn eben dieses Event getriggert wird.
Ich sehe nur das Problem, dass - wenn sich ein Benutzer in der Übersicht befindet und den Browser schließt, dieser Lock nicht mehr aufgehoben wird und somit niemand mehr in die Tabelle schreiben kann.
Eine andere Möglichkeit ist wohl die Nutzung der UNIQUE-Deklaration einer Spalte. Ist es in dem Fall sinnvoller direkt dann auf die Uniqe-Deklaration aufzulaufen oder sollte ich hier mit lock/unlock arbeiten ? Was meint ihr ?