Hello,
ich arbeite mit mysql.
Ich vermute jetzt mal, dass das Ganze üer HTTP / HTTPs geschehen soll?
Dann ist keine Verbindung zum Client vorhanden und damit mit einfachen Mitteln keine Zustandsorientierung möglich.
wir benötigen eine db Anwendung wo mehrere user gleichzeitig mit arbeiten aber jeder Datensatz nur einzelnt aufgerufen werden kann.
Heißt wenn Datensatz x von user y aufgerufen wurde soll bei user z der datensatz x übersprungen werden.
Sperren von Datensätzen im Datenhaltungssystem sollten immer so kurz wie möglich gehalten werden.
Daher wird die echte Sperre erst beim tatsächlichen Kontrolllese-/Schreibvorgang vorgenommen, wenn der Kontrolllesevorgang ohne Beanstandungen war.
Für eine zeitversetzte Sperre gibt es zwei praktikable Möglichkeiten. Beide berücksichtigen entsprechende Spalten im Datenmodell.
Antizipatorisches Sperren:
Du kannst in Deinem Datenmodell / deiner Applikation ein entsprechendes Flag, bestehend aus Usernummer und Zeitstempel vorsehen, dass bei der Datenmanipulation auf jeden Fall abgefragt werden muss. Beim Lesen zum Zwecke der Verarbeitung wird dieses auf die Usernummer und den Zeitpunkt des "Antrages" gesetzt, vorausgesetzt, dass es vorher auf neutral stand. Zusätzlich kann ein Konfliktzähler für die Schreibvorgänge mitgeführt werden. Wird nun ein "Bearbeitungsantrag" gestellt, wird zuerst geschaut, ob bereits ein Bearbeiter mit einer noch gültigen Zeit eingetragen ist. Nur, wenn dies nicht der Fall ist, werden die Flags gesetzt.
Das Abfragen und setzen funktioniert dabei in EINEM EINZIGEN Statement per Update-Versuch
update <tabelle>
set usernr = '$usernr' and 'begin' = now()
where begin < now() - $timeslot or (usernr = 0 and begin = 0);
Erst wenn dieses Statement failed, ruft man übr ein select die Spalten usernr und begin auf, um den Grund dafür zu erfahren.
Das Rückschreiben der Daten muss ein entsprechendes where-Statement enthalten, das dann die passende Benutzernummer und den Timestamp (sowie den Konfliktzähler) auf Übereinstimmung prüft.
Optimistisches Sperren mit Konfliktzähler:
Man holt sich einfach die Daten zur Bearbeitung nebst eines im Datnblock enthaltenen Konfliktzählers. Beim Rückschreibversuch wird dieser auf Übreinstimmung geprüft und wenn diese vorliegt, wird der Zähler um eins erhöht. Auch dies muss in einem einzigen Statement geschehen!
Geht der Schreibversuch fehl, hat man das philosophische Problem, was man mit den veränderten Daten nun anstellt. Schließlich hat der User Zeit und Arbeit darin investiert, sie zu verändern und möchte wahrschinlich ungern alle snochmal eingeben. Allerdings wird er nicht darum herum kommen, sch über den Status Quo des Datensatzes zu informieren und seine Veränderungen dnn ggf. darauf anzuwenden.
Bei der Installation solcher Maßnahmen sollte man auch immer daran denken, dass andere Module ggf. die automatische Verarbeitung mehrerer Datensätze auf einmal vornehmen müssen. Es muss also möglich sein, auch auf eine "echte" Sperre Rücksicht zu nehmen, die innerhalb der Laufzeit eines Scriptes ja möglich bleibt.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg