file locking, flock
Jannes
- php
Hallo zusammen,
ich habe noch mal kurz eine Frage zum Thema flock.
Vorausgesetzt, alle scripte die auf eine Datei zugreifen können, nutzen die gleichen flock-Regeln, stimmt es dann, das:
Wenn ein Script die Datei im Modus 'r' mit LOCK_SH geöffnet hat, alle lesen können, aber niemand schreiben kann/darf?
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).
Vielen Dank,
Jannes
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:
- Wenn ein Script die Datei im Modus 'r' mit LOCK_SH geöffnet hat, alle lesen können, aber niemand schreiben kann/darf?
- 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
Hi,
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.
Hängt das mit den davorigen Ausführungen über File Locking irgendwie zusammen, oder ist das unbeabsichtigt ins Posting reingerutscht?
MfG ChrisB
Hello,
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.Hängt das mit den davorigen Ausführungen über File Locking irgendwie zusammen, oder ist das unbeabsichtigt ins Posting reingerutscht?
WEnn Du aufmerksam liest, dann müsstest Du den Anknüpfungspunkt finden. Für zeitverstztes logisches Locking ist ein _automatischer_ Hash über den kompletten Record im Record einfach Gold wert, jedenfalls erheblich mehr, als jeder automatische Zeitstempel.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
Hängt das mit den davorigen Ausführungen über File Locking irgendwie zusammen, oder ist das unbeabsichtigt ins Posting reingerutscht?
WEnn Du aufmerksam liest, dann müsstest Du den Anknüpfungspunkt finden. Für zeitverstztes logisches Locking ist ein _automatischer_ Hash über den kompletten Record im Record einfach Gold wert, jedenfalls erheblich mehr, als jeder automatische Zeitstempel.
Ach so, du behandelst das Thema also nur mal wieder "ausführlicher", als ob der Fragestellung nötig gewesen wäre :-)
MfG ChrisB
Hello,
Hängt das mit den davorigen Ausführungen über File Locking irgendwie zusammen, oder ist das unbeabsichtigt ins Posting reingerutscht?
WEnn Du aufmerksam liest, dann müsstest Du den Anknüpfungspunkt finden. Für zeitverstztes logisches Locking ist ein _automatischer_ Hash über den kompletten Record im Record einfach Gold wert, jedenfalls erheblich mehr, als jeder automatische Zeitstempel.
Ach so, du behandelst das Thema also nur mal wieder "ausführlicher", als ob der Fragestellung nötig gewesen wäre :-)
Na irgendwo muss man seinen Gedanken ja noch freien Lauf lassen dürfen.
Ist doch besser hier, als bei Aldi auf dem Preisausschreiben :-)
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Moin!
WEnn Du aufmerksam liest, dann müsstest Du den Anknüpfungspunkt finden. Für zeitverstztes logisches Locking ist ein _automatischer_ Hash über den kompletten Record im Record einfach Gold wert, jedenfalls erheblich mehr, als jeder automatische Zeitstempel.
Nein. Warum Hash? Was bringt das mehr als die Info "es hat sich was geändert, aber ich sage nicht, was"?
Wer eine Detektionsmöglichkeit braucht, baut sich ganz simpel was per Zähler:
UPDATE ...datensatz..., counter=counter+1 WHERE .... AND counter=123
123 war der Wert des Counters beim Auslesen der alten Daten. Das Update wird nichts schreiben, wenn der Counter zwischenzeitlich durch gleichartige Updates verändert wurde. Die Prüfung der affected_rows() ist also obligatorisch. Außerdem erkennt man an der Differenz, wieviele Bearbeitungen es in der Zwischenzeit gab.
Mit deinem Hash kriegst du deutlich weniger Info. Und Automatik hilft dir auch nicht, weil die Abfrageapplikation mithelfen muss.
- Sven Rautenberg