Tom: file locking, flock

Beitrag lesen

Hello Jannes,

ich habe noch mal kurz eine Frage zum Thema flock.

Eine gute Übersicht zu diesem Thema gibt der Artikel "Sperren von Dateien", der aber über die Forumssuche leider schwer zu finden ist...
http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/

Aber im Index der Fachartikel steht er unter "Programmiertechnik".

Vorausgesetzt, alle scripte die auf eine Datei zugreifen können, nutzen die gleichen flock-Regeln, stimmt es dann, das:

  1. Wenn ein Script die Datei im Modus 'r' mit LOCK_SH geöffnet hat, alle lesen können, aber niemand schreiben kann/darf?
  1. Wenn ein Script eine Datei im Modus 'r+' mit LOCK_EX geöffnet hat, alle anderen in der Zeit weder lesen noch schreiben können?

Soweit wie ich es (bis jetzt) verstanden habe, sollte das so sein, aber ich hätte es gerne hier durch fachkundigere als ich es bin, bestätigt (oder korrigiert).

Der Öffnungsmodus und der "für-Andere-Modus" (Locking-Status) sind erstmal vollkommen getrennt zu betrachen. Auf den Öffnungsmodus wirken die Dateirechte des Filesystems (bei Linux sind das "rwx", ACL, Attribute). Auf die Lock-Anforderung wirkt der aktuelle Locking-Status.

Wenn also eine Datei mit einem Advisory-Lock LOCK_SH belegt ist, kann jeder andere Prozess ebenfalls ein Advisory-Lock mit LOCK_SH anfordern UND erhalten, aber KEIN Advisory-Lock mit LOCK_EX.

Wenn also mehr als das eigene LOCK_SH auf eine Datei eingetragen sind, kann KEINER der Prozesse, ein LOCK_EX bekommen. Ist nur ein einziges LOCK_SH auf die Datei eingetragen, dann kann der Besitzer des LOCK_SH dieses in ein LOCK_EX umwandeln, aber alle NICHT-Besitzer dürfen dies nicht. Sie können dann nur ebenfalls ein LOCK_SH bekommen.

Ob tatsächlich geschreiben wird, muss immer noch der Prozess bestimmen. Er kann ein Advisory-Lock einfach ignorieren.

Nun könnte man meinen, dass ein Mandatory-Lock doch besser wäre...
Das stimmt im Prinzip auch. Da aber unter Linux die Prozesse i.d.R. auf demselben Host ausgeführt werden, auf dem auch die Files zugänglich gemacht werden, hat der Adminstrator volle Kontrolle über die Prozesse (welche er zulässt). Bei Windows und auch (teilweise) bei Novell werden aber die Prozesse normalerweise auf einem vom Filesystem (bereitstellenden) entfernten Host ausgeführt. Hier wäre es daher nahezu unsinnig, mit Advisory Locks zu arbeiten.

Ich hoffe, ich habe Dich nicht noch mehr verwirrt.

Siehe bitte bei Google : Mandatiry Lock, Advisory Lock, zeitversetzter logischer Lock ("academic Lock")

Im Web benötigt man meistens den zeitversetzten logischen Lock, der entweder Einfluss auf das Datenmodell hat, oder aber durch Prüfsummen realisiert werden kann, die aber wiederrum bisher von fast keinem DBMS unterstützt werden.

MySQL täte als "das führende Internet-DBMS" gut daran, eine Funktion record_checksum() einzuführen!
Besser noch: einen Datentyp einzuführen, der im Record automatisch als Hash seiner Daten abgelegt wird.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de