Michael Schröpl: mehrere Benutzer - eine Datei - was kann passieren ?

Beitrag lesen

Problem von möglichem Datenverlust bei mehreren gleichzeitigen Zugriffen auf eine Datei gelesen. Bis zu diesem Zeitpunkt habe ich mir eigentlich auch noch keine Gedanken darüber gemacht und eigentlich vermutet, dass das Betriebssystem dies koordiniert.

Tja, Mitte der 80er war ich mal Administrator auf einem Host. Da ging das. (Insbesondere mit verschiedenen Öffnungsmodi, welche parallele Zugriffe erlaubten oder auch nicht - sogar Sperren einzelner Datensätze ging ... BS2000 war wunderbar.)

Warte noch 10-20 Jahre, dann können die PCs und Workstations das *vielleicht* auch wieder ... :-(

Dazu lese ich die ursprüngliche Datei (xx.htm) zur Gänze ein und schreibe diese Zeilen mit einigen neuen in eine weitere Datei (xx.tmp). Am Ende benenne ich diese Datei dann wieder um (xx.tmp > xx.htm). Kann es bei mehreren gleichzeitigen Schreib- und/oder Lesezugriffen zu Problemen (=Datenverlust) kommen ???

Die Idee mit dem Umbenennen ist schon mal sehr gut.
Was Du aber nicht verhinderst, das ist, daß zwei quasi-gleichzeitig startende Programme simultan die Daten einlesen, in zwei verschiedene temporäre Dateien ihr Ergebnis schreiben und nacheinander die Umbenennung durchführen. Die Ergebnisse des ersten Programms gehen dabei verloren.

Synchronisation ist eine Sache für sich ... der Trick wäre, daß das zweite Programm merkt, daß das erste arbeitet. Das geht aber nur mit einer unteilbaren Operation, die das Semaphor sowohl abfragt als auch setzt.
(Das Posten in unser Forum zeigt sporadisch Symptome genau eines solchen Problems: Zwei Leute überschreiben einander ihre Postings, weil sie dieselbe "Nummer gezogen" haben, aus der später ihr Dateiname bestimmt wird. Falls Dir jemals eine Diskrepanz zwischen Überschrift eines Postings in der Hauptdatei und Inhalt des Postings in der Posting-Datei auffällt: *Das* ist es, was dann passiert.)

Du könntest die Gefahr weiter reduzieren, indem das Programm schon *vor* dem Lesen der Datei diese ebenfalls umbenennt (xx_read.tmp). Das ist etwas, was das zweite Programm nicht gleichzeitig ebenfalls tun kann - *das* sollte das Betriebssystem in der Tat synchronisieren. Das zweite Programm braucht dann halt eine Fehlerbehandlungsroutine, weil sein Umbenennungsversuch schiefgeht.