Take: Dateisperren im Dauereinsatz

Beitrag lesen

Moin,

Und das selbst, wenn A und B verschiedene Teile der Datei ändern wollen. Einige DBMS können datensatzbasiert sperren, da passiert sowas nicht. Das Problem muss doch aber schon gelöst sein, denn Dateisperren existieren ja nicht erst seit gestern. Nach meinen Überlegungen muss der Prozess, der von SH kommend ein EX anfordert, ein Timeout haben. Wenn dieses eintritt, muss die gesamte Aktion für gescheitert erklärt werden, inklusive dass die Daten, die vorher aus der Datei gelesen wurden, ungültig werden. Es muss dann von vorn begonnen werden.

Dieser Ansatz hört sich für mich gut an. Einziges Problem ist, dass dann das komplette Programm auf "von vorn beginnen" eingerichtet werden muss. Denn mit den eingelesenen Daten geschieht ja etwas, sie werden im ganzen Programm verteilt.

Das Problem ist jedoch eigentlich noch weitreichender, selbst mit Datenbank. Webbasierte Bearbeitung findet ja in mehreren Prozessen statt. Aufgrund eines Requests von A liest ein Prozess die Daten, erzeugt eine Response mit dem Formular, und beendet sich (natürlich unter Verlust aller Sperren). Nun hat der Anwender A fertig und will die Daten schreiben, aber Anwender B war schneller, und wenn A im selben Bereich geändert hat, sind Bs Änderungen gefährdet. Dieses TOCTTOU-Problem zu lösen, geht mit Dateisperen allein nicht mehr. Da braucht es auch noch einen Zeitstempel oder ein ähnliches eindeutiges Merkmal (Checksum), um die Originalität der Daten vor dem Ändern zu prüfen.

Dieses Problem ist mir durchaus bewusst. Es liegt allerdings mMn. auf einem höheren Abstraktionslayer. Beginnt ein Benutzer eine Datei zu editieren, wird ihm der Zeitstempel des letzten Edits mitgegeben. Wenn er speichert, wird anhand des Zeitstempels (oder einer Versionsnummer, etc.) überprüft, ob die Datei inzwischen noch einmal geändert wurde. Wenn ja, bekommt der Benutzer eine Fehlermeldung und den Hinweis, er solle doch bitte seine Änderungen an die neue Version der Datei anpassen.
Dieser Mechanismus erfordert allerdings die Lösung des von mir angesprochenen Problems mit Dateisperren, oder?

Gruß,
Take