zur Gesamtnavigation A A A

Sperren und reservieren

Vorbemerkung

Sperren und Reservieren sind zwei Maßnahmen, um konkurrierende Aktionen auf einzelne Elemente innerhalb des Anwendungssystems zu vermeiden.

Beim Sperren, werden spezielle Dateien erzeugt, um eine bestimmte Aktion ausführen zu können. Nur wenn das Skript selber die nötigen kurzfristige/n Sperrdatei/en erzeugen oder übernehmen kann, kann das Skript mit der Aktion fortfahren und z.B. langfristige Sperren oder Reservierungen erzeugen.

Beim Reservieren werden Datensätze in spezielle Datenbanktabellen eingetragen. Diese Datensätze werden als Reservierungen bezeichnet. Um eine Reservierung mit den Systemfunktionen erzeugen zu können, werden zuvor eine oder mehrere kurzfristige Sperrdateien erzeugt und anschließend wieder gelöscht.

Nur wenn die vom System vorgesehenen Maßnahmen korrekt angewendet werden, wird vermieden, dass konkurrierende Aktionen gleichzeitig auf einem Objekt ausgeführt werden und dadurch Fehler entstehen.

zum Anfang

Sperrdateien, um konkurrierende Zugriffe zu vermeiden

kurzfristige Sperrdateien

Es gibt zwei Anwendungsbereiche für kurzfristige Sperrdateien.
Zum einen gibt es die Sperrdateien, die nur für das Schreiben anderer Sperrdateien benötigt werden.
Zum anderen gibt es die kurzfristige Sperrdateien, um dauerhafte, aber zeitlich befristete Reservierungen in Datenbanktabellen eintragen zu können. Die Reservierungen der Objekte sind nötig, um diese Objekte exklusiv manipulieren zu können oder Veränderungen durch andere an den reservierten Objekten zu verhindern, damit die eigenen Aktionen ungestört ausgeführt werden können.

Sperrdateien zum Erzeugen von Sperrdateien

  • __wm/__reserviert/sperrdatei.csv
    • Diese Datei darf nur von der Funktion sperrdatei_sperren_erzeugen() in __zac4web/__funktionen/sperren.php erzeugt werden und muss, wenn die Sperrdatei erzeugt werden konnte, von dieser Funktion auch am Ende wieder gelöscht werden. Diese Datei dient nur dazu, den Schreibzugriff auf die Sperrdatei "sperren.csv", die eine etwas längere Haltbarkeit hat, zu steuern.
    • Sollte die Datei sperrdatei.csv wegen einer Störung im Ablauf der Funktion sperrdatei_sperren_erzeugen() nicht gelöscht werden, kann die Datei nur "manuell" (z.B. durch Zugriff auf die Datei mit einem Dateimanagement-Programm wie FileZilla) gelöscht werden.
  • __wm/__reserviert/sperren.csv
    • Diese Datei darf nur von der Funktion sperrdatei_sperren_erzeugen() in __zac4web/__funktionen/sperren.php erzeugt oder überschrieben werden.
    • Auch darf nur die Funktion sperrdatei_sperren_erzeugen() einen Dateihandler auf die Datei erzeugen.
    • Die Datei soll konkurrierende Schreib- und Löschzugriffe auf die langfristigen Sperrdateien und die Informationsdatei "sperre.php" verhindern, indem nur derjenige Aktionen auf die zuvor genannten Dateien ausführen kann, wer den Dateihandler für die Datei sperren.csv besitzt.
    • Die Skripte, welche mit der Funktion sperrdatei_sperren_erzeugen() den Dateihandler auf die Datei "__wm/__reserviert/sperren.csv" erzeugen, sollten gewährleisten, dass der Dateihandler nach Ausführung der Aktionen geschlossen wird und die Datei gelöscht wird.

Sperrdateien zum Erzeugen von Reservierungen

  • __wm/__reserviert/vorgang_reservieren.csv
    • Diese Sperrdatei wird von den Funktionen reservierung_vorgang_beginnen_ms() und reservierung_vorgang_beginnen_ms_admin() in __zac4web/__funktionen/reservierung.php erzeugt und -, wenn keine unerwartete Störung eintritt, - auch gelöscht.
    • Mit der Sperrdatei soll sichergestellt werden, dass bei parallelen Aufrufen der Funktion reservierung_vorgang_beginnen_ms() und/oder reservierung_vorgang_beginnen_ms_admin() nicht mehreren Aufrufern der Funktion die gleiche Reservierungsnummer zugeordnet wird, sondern jedem Aufrufer ein eigener Datensatz mit individueller Reservierungsnummer zugeteilt wird. Die Reservierungsnummer wird benötigt, um Datensätze, Datenbanktabellen, Dateinamen/Dateien und/oder Verzeichnisnamen/Verzeichnisse exklusiv für Manipulationen reservieren zu können und sich auszuweisen, wenn eine entsprechende Manipulation der Objekte erfolgen soll.
  • __wm/__reserviert/db_reservieren.csv
    • Diese Sperrdatei wird von den Funktionen reservieren_dsatz_ms() und reservieren_tabelle_ms() erzeugt und auch wieder gelöscht, um neue Datensätze in die Datenbanktabellen _reservierte_datensaetze bzw. _reservierte_tabellen eintragen zu können.
  • __wm/__reserviert/verzeichnis_reservieren.csv
    • Diese Sperrdatei wird von den Funktionen reservieren_datei_ms(), reservieren_verzeichnis_ms() und reservieren_space_ms() erzeugt und auch wieder gelöscht, um neue Datensätze in die Datenbanktabellen _reservierte_dateien, _reservierte_verzeichnisse bzw. reservierter_space eintragen zu können.

zum Anfang

langfristige Sperrdateien

Die Sperrdateien dienen vor allem dazu, um formularbasierte Veränderungen an Datenbankinhalten, Dateien und Verzeichnissen zu verhindern, während mit einem Programm wie z.B. FileZilla oder phpMyAdmin Veränderungen am System vorgenommen werden.

Die Sperrdateien werden aber auch benötigt, wenn formularbassiert grundlegende Änderungen am System vorgenommen werden sollen, die ein Logout aller angemeldeten Benutzer außer dem Aufrufer erzwingen.

Mit den Sperrdateien "X_neu.csv" wird ein sanfter Übergang erreicht. Die Sperrdateien "X_ganz.csv" erzeugen für die angemeldeten Nutzer einen "harten" Übergang, wenn die begonnenen Vorgänge zwangsweise abgebrochen werden. Der harte Übergang ist dann sinnvoll, wenn Reservierungen immer wieder verlängert werden oder ein sofortiges Eingreifen erforderlich ist.

  • __wm/__reserviert/db_neu.csv
    __wm/__reserviert/verzeichnis_neu.csv
    __wm/__reserviert/db_ganz.csv
    __wm/__reserviert/verzeichnis_ganz.csv
    • Um die vier zuvor genannten Dateien erzeugen oder löschen zu können, muss der Aufrufer
      • Administrator im Bereich "home" sein.
      • den Handler auf die Datei __wm/__reserviert/sperren.csv besitzen
      • und Inhaber der Dokumentationsdatei __wm/__reserviert/sperre.php sein oder die Dokumentationsdatei __wm/__reserviert/sperre.php muss veraltet sein.
    • Die Sperrdateien db_neu.csv und db_ganz.csv sollen Manipulationen von Datenbankinhalten verhindern.
    • Die Sperrdateien verzeichnis_neu.csv und verzeichnis_ganz.csv sollten Manipulationen von Dateien und Verzeichnissen verhindern.
    • Die Sperrdateien db_neu.csv und verzeichnis_neu.csv sollen verhindern, dass neue Reservierungen für die entsprechenden Elemente eingetragen werden. Daher sollen die Skripte, welche die Funktionen reservierung_vorgang_beginnen_ms() aufrufen, zuvor prüfen, ob nicht eine Sperrdatei vorhanden ist, die die Ausführung der geplanten Aktieonen verhindern soll. Dabei ist aber nicht nur zu prüfen, ob "X_neu.csv" vorhanden ist, sondern auch, ob "X_ganz.csv" vorhanden ist.
    • Die Sperrdateien db_ganz.csv und verzeichnis_ganz.csv sollen verhindern, dass Reservierungen auf die entsprechenden Elemente verlängert werden. Daher sollen die Skripte, welche eine Reservierung für einen Bearbeitungsvorgang verlängern möchten, zuvor prüfen, ob nicht eine Sperrdatei "X_ganz.csv" vorhanden ist, die das Verlängern, der Reservierungen verhindert.
    • Zu beachten ist allerdings, dass die Prüfungen, ob eine entsprechende Sperrdatei X_neu.csv und/oder X_ganz.csv vorhanden ist, im Allgemeinen im Skript jeweils nur dann ausgeführt werden, bevor eine Reservierungsnummer für einen neuen Bearbeitungsvorgang erzeugt werden soll bzw. bevor die vorhandenen Reservierungen verlängert werden sollen. Sobald also ein aufgerufenes Skript festgestellt hat, dass keine störenden Sperrdatei vorhanden ist, wird das Skript seinen Ablauf ungehindert fortsetzen, auch wenn parallel dazu durch ein anderes Skript eine Sperrdatei erzeugt wird.
    • Wenn ein Vorgang darauf angewiesen ist, dass gleichzeitig von keinem anderen Nutzer Veränderugen an Datenbank- und Verzeichnisinhalten ausgeführt werden dürfen, ist eine der Sperrdateikombinationen (_reserviert/db_neu.csv und __wm/_reserviert/verzeichnis_neu.csv) oder (_reserviert/db_ganz.csv und __wm/_reserviert/verzeichnis_ganz.csv) zu erzeugen. Zur Unterstützung des Vorgangs wird daher beim Aufruf der Funktion "reservierung_vorgang_beginnen_ms()" immer geprüft, ob eine der beiden Sperrdateikombinationen vorhanden ist. Nur wenn keine der beiden Sperrdateikombinationen vorhanden ist, darf die Funktion eine Reservierungsnummer für einen neuen Bearbeitungsvorgang eintragen.
  • __wm/__reserviert/mitglieder_verwalten
    • Diese Datei muss ein Skript erstellen, wenn es verhindern möchte, dass andere Skripte die Zugangsdaten von Personen verändern.
    • Wenn eine gültige Version der Datei vorhanden ist, können Nutzer ihre Zugangsdaten nicht verändern.
    • Auch die Mitgliederverwaltung ist dann eingeschränkt, weil weder Mitglieder neu in das System aufgenommen werden und gelöscht werden können.
  • __wm/__reserviert/sperre.php
    • Diese Datei ist eine Dokumentationsdatei und keine Sperrdatei, wirkt aber trotzdem in bestimmten Situationen wie eine Sperrdatei.
    • In der Datei wird festgehalten, wie lange die zuvor genannten langfristigen Sperrdateien ("X_neu.csv", "X_ganz.csv", "mitglieder_verwalten"), sofern sie vorhanden sind, gültig sind und wer die Sperre(n) erzeugt hat.
    • Solange die Sperrdateien gültig sind, kann nur der Inhaber der Sperren oder ein Administrator im Bereich "home" diese aufheben.
    • Um die Datei sperre.php lesen und verändern zu können, wird ein Handler auf die kurzfristige Sperrdatei sperren.csv benötigt. Nach der Veränderung der Datei sperre.php sollte der Handler auf die kurzfristige Sperrdatei sperren.csv geschlossen und die Datei sperren.csv gelöscht werden.
  • __wm/__reserviert/sperre_login.php
    • Diese Datei ist gleichzeitig Dokumentationsdatei und Sperrdatei.
    • In der Datei wird festgehalten, wie lange diese Datei gültig ist und von wem sie erstellt wurde.
    • Die Datei darf nur erstellt werden, wenn der Aufrufer einen Handler auf die kurzfristige Sperrdatei sperren.csv besitzt.
    • Die Datei darf nur erstellt werden, wenn der Aufrufer im Bereich "home" Administrator ist.
    • Die Datei verhindert, solange sie existiert und gültig ist, dass sich Mitglieder im System einloggen können. Auf bereits eingeloggte Mitglieder wirkt sich die Datei selber nicht aus.
    • Bei jedem Login-Versuch, wird geprüft, ob die Datei sperre_login.php existiert und gültig ist. Wenn die Datei nicht mehr gültig ist, wird die Datei automatisch gelöscht.

zum Anfang

Hinweis auf ein Sicherheitsrisiko

Von den System-Administratoren kann festgelegt werden, wie viele zeitlich parallele Anmeldungen mit den gleichen Nutzerdaten möglich sind.
Außerdem dürfen Administratoren im Bereich \"home\" auf bestimmten Seiten die Sperrdateien db_neu.csv, db_ganz.csv, verzeichnis_neu.csv und verzeichnis_ganz.csv umgehen.

Wenn zwei parallele Anmeldungen mit den Zugangsdaten eines Administrators aber unterschiedlichen session_IDs vorhanden sind, und mit der einen session_ID eine Sperrdatei gesetzt worden ist, kann mit der anderen session_ID - noch während der Gültigkeit der Sperrdatei -, die Sperrdatei gelöscht werden oder Aktionen ausgeführt werden, für welche die Sperrdatei benötigt wird. Das Ziel der Blockade von Aktionen anderer Personen wird in diesem Fall also nicht vollständig erreicht. Das Sicherheitsrisiko könnte vermieden werden, wenn keine zeitlich parallelen gültigen Anmeldungen mit den gleichen Nutzerdaten möglich wären.
Daher können System-Administratoren auch einstellen, dass zu jedem Zeitpunkt zu allen Nutzerdaten höchstens eine Session eingetragen ist. Das ist aber aus zwei Gründen nicht praktikabel. Denn wenn
  • ein angemeldeter Nutzer - aus welchen Gründen auch immer - das Browserfenster schließt, ohne sich auszuloggen, könnte er sich erst nach einer (wahrscheinlich längeren) Wartezeit wieder einloggen, da eine Anmeldung immer session_dauer lang gültig ist. (Es sei denn, er kann sich zeitnah an einen Administrator wenden, der mit dem Skript "Sessions bereinigen" (__zac4web/_System/session_bereinigen.php) den Datensatz für die nicht korrekt beendete Session löscht. Dann könnte sich der Nutzer im Anschluss an das Löschen sofort wieder einloggen.)
  • ein Nutzer eine Sperre setzt, um ungestört per FTP-Client oder phpMyAdmin das System zu verändern und dafür mehr Zeit als session_dauer benötigt, müsste er sonst ständig eingeloggt sein und regelmäßig seine Anmeldung auffrischen, falls er die Möglichkeit haben möchte, die Sperrdateien vorzeitig löschen zu können. Auch wäre ohne ständiges Eingeloggtsein keine Verlängerung der Sperrdateien möglich, wenn die Aktion doch länger dauert als erwartet.

Da die Sperrdateien nur von einer doch wahrscheinlich begrenzten Anzahl an Nutzern gesetzt werden können (Sie müssen über das Recht "admin" im Bereich "home" verfügen) und anzunehmen ist, dass Personen, welche dieses Recht besitzen, immer dafür sorgen, dass Unberechtigte a) keinen Zugriff auf ihre Zugangsdaten haben und b) auch nicht eine existierende Anmeldung als Administrator nutzen können, wird dieses Risiko eingegangen, damit die Administratoren nicht zwangsweise warten müssen. Auf diese Weise wird auch verhindert, dass unnötig lange Sperren gesetzt werden. Außerdem könnten ansonsten Sicherheitslücken entstehen, wenn eine Maßnahme, für die eine Sperre benötigt wird, länger dauert, als ursprünglich geplant war, weil Sperren nicht nahtlos verlängert werden könnten.

zum Anfang

Reservierungen

Mit Reservierungen soll das parallele Verändern des gleichen Elements durch verschiedene Nutzer verhindert werden. Dieser Zweck wird aber nur erreicht, wenn immer dort, wo ein Element verändert werden soll, zunächst für den Aufrufer sämtliche notwendigen Reservierungen erzeugt werden und erst dann, wenn sichergestellt ist, dass der Aufrufer über alle notwendigen Reservierungen verfügt, die Veränderung des Elements ausgeführt wird.

Solange ein Skript für einen Aufrufer auf dem PHP-Server ausgeführt wird, kann das Skript über Dateihandler den parallelen Zugriff auf Dateien und über LOCK-Befehle den parallelen Zugriff anderer Skripte und anderer Nutzer auf Datenbanktabellen und Datensätze verhindern. Bzgl. des LOCK-Befehls ist dabei zu beachten, dass ein Skript "skript_A", solange es den LOCK auf "TAB_A" besitzt, selber nur dann auf weitere Datenbanktabellen "TAB_Xs" - und sei es auch nur lesend - zugreifen kann, wenn es auch diese Tabellen "TAB_Xs" mit dem LOCK-Befehl für sich reserviert hat.
Weil aber "zac4web"-Skripte keine benannten PIPEs zum PHP-Server nutzen, räumt der PHP-Server jeweils beim Ende eines "zac4web"-Skriptes automatisch auf und schließt noch bestehende Dateihandler und Datenbankverbindungen des Skripts. Daher kann in "zac4web"-Skripten mit Dateihandlern und LOCK-Befehlen keine Reservierung über mehrere Skriptaufrufe hinweg erreicht werden.
Vielfach laufen aber Bearbeitungsvorgänge in "zac4web"-Projekten über mehrere Skriptaufrufe. So fordert z.B. ein Nutzer ein Formular an, um einen Datensatz verändern zu können. Wenn er dann das Formular abschickt, ist das aus Sicht des Nutzers immer noch der gleiche Bearbeitungsvorgang, für den PHP-Server aber ein neuer Skriptaufuf. Um dem PHP-Server anzeigen zu können, dass Skriptaufrufe zu einem Bearbeitungsvorgang gehören, stellt daher "zac4web" ein eigenes Reservierungssystem zur Verfügung.
Damit das Reservierungssystem funktioniert, muss es für alle Bearbeitungsvorgänge, durch die Daten oder Dateien verändert werden sollen eingesetzt werden, also nicht nur dann, wenn ein Bearbeitungsvorgang über mehrere Skriptaufrufe läuft, sondern auch wenn der Vorgang nur einen Skriptaufruf dauert, da sonst Bearbeitungsvorgänge mit nur einem Skriptaufruf umfangreicheren Skriptaufrufen "dazwischenfunken" könnten.

Die allgemeinen Funktionen für das Reservieren befinden sich in den zwei Dateien __zac4web/__funktionen/reservierung.php und __zac4web/__funktionen/reservierung_nutzen.php. Die Datei reservierung.php enthält u.a. die Funktionen zur Erzeugung einer Reservierung und der Verlängerung von Reservierungen, die zu einem Bearbeitungsvorgang gehören. Die Funktionen zum Erzeugen einer Reservierung für eine Datei, eine Datenbanktabelle, eines Bereichs, eines Verzeichnisses oder einer Datei enthält die Datei "reservierung_nutzen.php". In jener Datei sind auch die Funktionen enthalten, mit denen geprüft werden kann, ob der Aufrufer eine gültige Reservierung für ein Element besitzt und zum Löschen der eigenen Reservierungen. Die Funktionen aus der Datei reservierung_nutzen.php setzen voraus, dass die Konstante zac4web_reservierung existiert und einen gültigen Wert aufweist.

Eine Reservierung (= Datensatz in der Datenbanktabelle _reservierung) wird mit der Reservierungs-Funktion reservierung_vorgang_beginnen_ms() oder reservierung_vorgang_beginnen_ms_admin() des Systems zac4web erzeugt. Falls die Funktion erfolgreich beendet werden kann, weist die Funktion einem Bearbeitungsvorgang eine Identifkationsnummer zu. Diese Identifkationsnummer liegt während der weiteren Skriptausführung als Konstante zac4web_reservierung vor und wird auch für die weiteren Reservierungen verwendet, die für den Bearbeitungsvorgang nötig sind (z.B. Reservierung eines Datensatzes, einer Datenbanktabelle, einer Datei oder eines Verzeichnisses), um die Zugehörigkeit der Reservierungen zum Bearbeitungsvorgang zu kennzeichnen. Die Funktion reservierung_vorgang_beginnen_ms_admin() kann nur von eingeloggten System-Administrator erfolgreich verwendet werden.

Wenn bei einem Skriptaufruf eine Reservierung erzeugt wird und in einem zeitlich nachgelagerten Skriptaufruf die Veränderung ausgeführt werden soll, muss die Reservierung so lange in den Datenbanktabellen eingetragen bleiben, bis der Vorgang abgeschlossen oder abgebrochen wird. Außerdem muss mit den Formularen oder über das Feld $_SESSION jeweils die Reservierungsnummer transportiert werden, um den Zusammenhang zum Bearbeitungsvorgang herstellen zu können. Beim Skriptaufruf ist aus dem übermittelten Wert für die Reservierungsnummer jeweils die Konstante zac4web_reservierung zu erzeugen, falls im weiteren Skriptverlauf - und sei es nur für die Ausgabe - diese Konstante benötigt wird.
Die Erzeugung der Konstanten geschieht am besten mit der Funktion reservierung_vorgang_verlaengern() oder einer Varianten davon, weil diese Funktionen auch die Zeitangaben in den zugehörigen Datensätzen in den anderen Reservierungstabellen anpassen. Unmittelbar vor der Ausführung von Schreibaktionen auf Dateien oder Datenbanktabellen sollte aber immer mit der/den passenden Prüffunktionen gestestet werden, ob der Aufrufer tatsächlich eine gültige Reservierung für das jeweilige Element besitzt, da die Verlängerungsfunktionen nur testen, ob eine Reservierung für den Bearbeitungsvorgang besteht, aber nicht ermitteln, für welche Elemente die Reservierung verlängert wurde.
Falls die Konstante bei einem Skriptaufruf lediglich für die Ausgabe benötigt wird, aber keine Reservierungen verlängert werden sollen, kann die Konstante zac4web_reservierung auch mit dem php-Befehl define() erzeugt werden.

Bevor die Reservierungsfunktion eine Reservierungsnummer erzeugt und einen Datensatz in die Datenbanktabelle _reservierung eintragen darf, muss sie die Sperrdatei vorgang_reservieren.csv erzeugen. (Für das Verlängern der Reservierung wird diese Sperrdatei nicht benötigt.) Nachdem die Sperrdatei erzeugt wurde, erzeugt das System eine Zufallszeichenkette, die als Identifkationsnummer für den neu zu startetenden Bearbeitungsvorgang verwendet werden soll. Nur wenn diese Zeichenkette (eine von 3610 unterschiedlichen Zeichenketten) zu diesem Zeitpunkt nicht in der Datenbank _reservierung eingetragen ist, wird sie dem Bearbeitungsvorgang zugewiesen. Falls der Datensatz in die Datenbanktabelle _reservierung eingefügt wurde oder festgestellt wurde, dass kein Datensatz eingetragen werden darf, weil die erzeugte Zufallszeichenkette schon vergeben ist, wird die Sperrdatei vorgang_reservieren.csv gelöscht. Der Nutzer sollte per Fehlermeldung darüber informiert werden, dass sein Bearbeitungswunsch aktuell nicht möglich ist, weil keine Reserivierung für ihn erzeugt werden konnte.

Da die Sperrdatei vorgang_reservieren.csv zu jedem beliebigen Zeitpunkt nur maximal einmal vorhanden sein darf, können nicht gleichzeitig für mehrere Nutzer Reservierungen eingetragen werden. Damit dies für die anderen Nutzer, die gerade nicht zum Zuge kommen können, sofort zu einer Fehlermeldung führt, ist es möglich, dass das System mehrfach versucht, die Sperrdatei und Zufallszeichenketten zu erzeugen, ohne dass der Nutzer das merkt. Die maximale Anzahl der Versuche und auch die Gültigkeitsdauer für Reservierungen können eingeloggte Systemadminiatratoren mit dem Formular Sessions und Reservierungen festlegen, welches mit dem gleichnamigen Schalter auf der Seite Systemdateien ändern aufgerufen werden kann. Je größer die Werte für die Konstanten in __wm/konstanten/reservierung.php sind, welche die zeitlichen Puffer für die Reservierungs- und zugehörigen Prüfaktivitäten kennzeichnen, desto geringer ist die Gefahr, dass parallele Veränderungsaktivitäten ausgeführt werden, die zu einem unzulässigen Zustand führen. Andererseits sollten die Werte für die Konstanten nicht zu groß gewählt werden, weil dann die Funktionalität eingeschränkt wird, manche Aktionen u.U. gar nicht mehr möglich sind und bei nicht planmäßigem Abbruch von Bearbeitungsvorgängn mit Reservierungen unnötig lange Wartezeiten entstehen, bis wieder auf die reservierten Elemente zugegriffen werden kann.

Für die Funktionalität Chatten läuft das Reservieren weitgehend ähnlich ab. Allerdings gibt es für das Chatten eine zusätzliche Tabelle ("_chats_sperren"), die den eigentlichen Reservierungstabellen vorgelagert ist. Dadurch kann ein Verantwortlicher für den Chat XYZ Aktivititäten anderer Nutzer in diesem Chat kurzfristig sperren, ohne dass er das ganze System oder größere Teile des Systems "stilllegen" muss. Das Sperren eines Chats ist immer dann erforderlich, wenn der Chat verwalten werden soll. Die Systemfunktionen zum Chatten nutzen die Tabelle "_chats_sperren" im Reservierungsprozess.

zum Anfang

Befehle für Reservierungen

Parameter für die Befehle

zum Anfang

Befehle zum Erzeugen von Reservierungen

Die nachfolgenden Befehle erzeugen jeweils die passende kurzfristige Sperrdatei und löschen diese wieder.

Von den Befehlen, die auf "_ms" enden gibt es jeweils auch eine Variante, die statt auf "_ms" auf "_os" endet. Die "_os"-Befehle erzeugen und löschen keine Sperrdatei. Die "_os"-Befehle sollten nur dann genutzt werden, wenn für die Ausführung eines Skriptes mehrere Reservierungen erzeugt werden müssen, welche die gleiche Sperrdatei benötigen. Zuvor muss aber mit einem geeigneten Befehl die zugehörige kurzfristige Sperrdatei erzeugt und nach Abshluss aller Reservierungsbefehle auch wieder gelöscht werden, damit das Konzept von "Sperren und Reservieren" nicht durchbrochen wird.

Das Reservieren von Elementen soll verhindern, dass andere Akteure die reservierten Elemente zwischenzeitlich verändern. Dies wird mit den Reservierungen allerdings nur erreicht, wenn im gesamten Anwendungssystem bei der Zuweisung der Werte für die Parameter der Reservierungsfunktionen die nachfolgenden Regeln angewendet werden.

Die einzelnen Blöcke mit den Hinweisen zu den Funktionen sind wie folgt aufgebaut:

Jeder Block besteht aus drei Zeilen. In der obersten Zeile dieses Blocks steht jeweils der Befehl mit all seinen Parametern. In der zweiten Zelle des Blocks steht, was mit dem Befehl reserviert werden kann und der Datentyp des Rückgabewertes der Funktion. Die dritte Zeile enthält Hinweise zur Funktion.

zum Anfang

Reihenfolge zum Erzeugen mehrerer Reservierungen"

Wenn für eine Aktion mehrere unterschiedliche Reservierungen erforderlich sind, sollte folgende Reihenfolge zur Erzeugung der Reservierungen eingehalten werden:
1. aendern = 1
2. aendern = 0
3. dsatz bzw. datei

Mit den Werten für die Konstanten max_warten und zeitreseve, die in der Datei __wm/__konstanten/reservierung.php definiert werden und von der Funktion: reservierung_vorgang_hinweis_warten_evtl() in der Datei __zac4web/__funktionen/reservierung.php verwendet werden, kann gesteuert werden, wie sich das System verhalten soll, wenn eine vorhandene konkurrierende Reservierung auf einen Datensatz die Ausführung der gewünschten Aktion auf Datenbanktabellen verhindert.

Folgende Szenarien sind möglich:
  • Wenn eine erforderliche Reservierung nicht möglich ist, dann sollten genereall alle bisher vorgenommenen Reservierungen ebenfalls abgebrochen werden, damit sich Skripte nicht gegenseitig blockieren.
  • Wenn Reservierung mit aendern = 1 oder aendern = 0 möglich war, aber konkurrierende Reservierungen vorliegen, welche die unmittelbare Bearbeitung verhindern ($bearbeiten_erlaubt["bearbeiten_ab"] > 0 ), dann Aufheben aller vorgenommenen Reservierungen, wenn die ermittelten konkurrierenden Reservierungen noch länger als $max_warten Minuten gelten.
  • Bei kürzerer Zeitspanne die vorgenommenen Reservierungen bestehen lassen und den Nutzer darüber informieren, dass er warten muss. Außerdem dem Nutzer anbieten, die eingetragenen Reservierungen sofort zu verlängern, auf einen Zeitpunkt, der ca. $zeitreseve Minuten nach Ende der konkurrierenden Reservierungen liegt, falls die ermittelte verbleibende Dauer der konkurrierenden Reservierungen größer ist als die Dauer der eigenen Reservierungen.

zum Anfang

Befehle zum Verlängern von Reservierungen

Jede der nachfolgenden Funktion liefert einen booleschen Rückgabewert. Falls dieser Wert true ist, wurde auch die Konstante zac4web_reservierung erzeugt, die für die Reservierungsvorgänge benötigt wird.

reservierung_vorgang_verlaengern($con, $reservierung, $reservieren_bis)
Es werden sämtliche Reservierungen verlängert, die zu dem Bearbeitungsvorgang gehören.
reservierung_vorgang_verlaengern_ohne($con, $reservierung, $reservieren_bis)
Es wird nur die Reservierung für den Bearbeitungsvorgang verlängert.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen unverändert.
reservierung_vorgang_verlaengern_mit_dsatz($con, $reservierung, $reservieren_bis)
Es werden sowohl alle Reservierungen für Datensätze verlängert, die zu dem Bearbeitungsvorgang gehören, als auch die Reservierung für diesen Bearbeitungsvorgang.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen unverändert.
reservierung_vorgang_verlaengern_mit_db($con, $reservierung, $reservieren_bis)
Es werden sowohl alle Reservierungen für Datensätze und Datenbanktabellen verlängert, die zu dem Bearbeitungsvorgang gehören, als auch die Reservierung für diesen Bearbeitungsvorgang.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen unverändert.
reservierung_vorgang_verlaengern_mit_datei($con, $reservierung, $reservieren_bis)
Es werden sowohl alle Reservierungen für Dateien verlängert, die zu dem Bearbeitungsvorgang gehören, als auch die Reservierung für diesen Bearbeitungsvorgang.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen unverändert.
reservierung_vorgang_verlaengern_mit_dir($con, $reservierung, $reservieren_bis)
Es werden sowohl alle Reservierungen für Dateien und Verzeichnissen verlängert, die zu dem Bearbeitungsvorgang gehören, als auch die Reservierung für diesen Bearbeitungsvorgang.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen unverändert.
reservierung_vorgang_verlaengern_mit_space($con, $reservierung, $reservieren_bis)
Es werden alle Reservierungen verlängert, die zu dem Bearbeitungsvorgang gehören.
Die Wirkung der Funktion ist identisch mit der Wirkung der Funktion "reservierung_vorgang_verlaengern(), es werden auch durch diese Funktion die Reservierungen in den Datenbanktabellen _reservierte_datensaetze, _reservierte_tabellen, _reservierte_dateien, _reservierte_verzeichnisse, _reservierter_space und _resrvierung verlängert.

zum Anfang

Befehle zum Prüfen, ob eine Reservierung vorhanden und gültig ist

Wenn der Aufrufer eine gültige Reservierung für das mit der Funktion spezifizierte Element besitzt, liefern die nachfolgenden Funktionen den booleschen Wert true. Anderenfalls ist der Rückgabewert der boolesche Wert false.

zum Anfang

Befehle zum Aufheben einer einzelnen Reservierung

Mit den nachfolgenden Befehlen kann ein Element für andere Bearbeitungsvorgänge freigegeben werden, sobald die Reservierung nicht mehr benötigt wird. Die anderen Reservierungen des Bearbeitungsvorgangs bleiben unverändert erhalten.

Die Löschbefehle werden allerdings nur ausgeführt, wenn keine langfristige Sperrdatei die Veränderung der Datenbank verhindert.

Sofern kein Abfragefehler auftritt, ist der Rückgabewert der boolesche Wert true. Wenn wegen der Sperrdatei nicht gelöscht werden kann oder ein Abfragefehler auftritt, wird der boolesche Wert false zurückgegeben. Im allgemeinen interessiert der Rückgabewert dieser Funktionen nicht, weil Reservierungen bei der Erzeugung und Verlängerung durch die Variable $reservieren_bis immer zeitlich befristet sind und vom System "abgelaufene" Reservierungen regelmäßig gelöscht werden, sobald ein neue Reservierung erzeugt wird.

Datensatz reservierung_aufheben_dsatz($con, $database, $tabelle, $spalte, $wert)
Datenbanktabelle reservierung_aufheben_tabelle($con, $database, $tabelle)
Datei reservierung_aufheben_datei($con, $verzeichnis, $datei)
Verzeichnis reservierung_aufheben_verzeichnis($con, $verzeichnis)
Speicherplatz reservierung_aufheben_space($con, $bereich_ID)

zum Anfang

Befehle zum Löschen mehrerer/aller Reservierungen, die zu einem Bearbeitungsvorgang gehören

Jede der nachfolgenden Funktion liefert einen booleschen Rückgabewert.

reservierung_vorgang_beenden_nur_dsatz_alle($con)
Es werden nur alle Reservierungen für Datensätze gelöscht, die zu dem Bearbeitungsvorgang gehören.
Alle anderen Reservierungen, die zu dem Bearbeitungsvorgang gehören, bleiben gültig.
reservierung_vorgang_beenden_mit_dsatz($con)
Es werden sowohl alle Reservierungen für Datensätze gelöscht, die zu dem Bearbeitungsvorgang gehören, als auch die Reservierung für diesen Bearbeitungsvorgang.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen zunächst erhalten, sind aber sofort ungültig und können daher nicht mehr genutzt werden.
reservierung_vorgang_beenden_nur_db_alle($con)
Es werden nur alle Reservierungen für Datensätze und Datenbanktabellen gelöscht, die zu dem Bearbeitungsvorgang gehören.
Alle anderen Reservierungen, die zu dem Bearbeitungsvorgang gehören, bleiben gültig.
reservierung_vorgang_beenden_mit_db($con)
Es werden sowohl alle Reservierungen für Datensätze und Datenbanktabellen gelöscht, die zu dem Bearbeitungsvorgang gehören, als auch die Reservierung für diesen Bearbeitungsvorgang.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen zunächst erhalten, sind aber sofort ungültig und können daher nicht mehr genutzt werden.
reservierung_vorgang_beenden_nur_datei_alle($con)
Es werden nur alle Reservierungen für Dateien gelöscht, die zu dem Bearbeitungsvorgang gehören.
Alle anderen Reservierungen, die zu dem Bearbeitungsvorgang gehören, bleiben gültig.
reservierung_vorgang_beenden_mit_datei($con)
Es werden sowohl alle Reservierungen für Dateien gelöscht, die zu dem Bearbeitungsvorgang gehören, als auch die Reservierung für diesen Bearbeitungsvorgang.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen zunächst erhalten, sind aber sofort ungültig und können daher nicht mehr genutzt werden.
reservierung_vorgang_beenden_nur_dir_alle($con)
Es werden nur alle Reservierungen für Dateien und Verzeichnissen gelöscht, die zu dem Bearbeitungsvorgang gehören.
Alle anderen Reservierungen, die zu dem Bearbeitungsvorgang gehören, bleiben gültig.
reservierung_vorgang_beenden_mit_dir($con)
Es werden sowohl alle Reservierungen für Dateien und Verzeichnissen gelöscht, die zu dem Bearbeitungsvorgang, als auch die Reservierung für diesen Bearbeitungsvorgang.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen zunächst erhalten, sind aber sofort ungültig und können daher nicht mehr genutzt werden.
reservierung_vorgang_beenden_ohne($con)
Es wird nur die Reservierungsnummer für den Bearbeitungsvorgang gelöscht.
Sofern andere Reservierungen zu dem Bearbeitungsvorgang gehören, bleiben die Datensätze dafür in den Reservierungstabellen zunächst erhalten, sind aber sofort ungültig und können daher nicht mehr genutzt werden.
reservierung_vorgang_loeschen_alle($con)
Es werden sämtliche Reservierungen in allen Reservierungstabellen gelöscht, die zu dem Bearbeitungsvorgang gehören.

zum Anfang

Weitere Hinweise

Vorgang abbrechen

Meistens werden mindestens zwei Skriptaufrufe für die Ausführung einer Aktion benötigt. Datei werden oftmals beim ersten Skriptaufruf Reservierungen erzeugt, die beim zweiten Skriptaufruf auf Gültigkeit geprüft werden, bevor die Aktion ausgeführt wird. Damit der Aufrufer zwischendurch die Aktion abbrechen kann und dabei alle Reservierungen und Sperren, die zu dem Bearbeitungsvorgang gehören, gelöscht werden, kann dem Aufrufer ein Schalter zur Auswahl angeboten, hinter dem sich ein Formular verbirgt, welches das Skript "__zac4web/_db/reservierung_abbrechen.php" aufruft. Das Skript kann aus dem Feld $_POST folgende Informationen verarbeiten: "entsperren", "reservierung", "aus", "seite".

Wenn das Skript das Element "entsperren" mit dem Feld $_POST erhält, löscht es alle langfristigen Sperren, die für den Aufrufer eingetragen sind.

Das Element "reservierung" muss in dem Feld $_POST enthalten sein, ansonsten wird der Aufrufer ausgeloggt. Wenn der Wert für "reservierung" eine gültige Reservierung ist, werden Datensätze aus den Reservierungsdatenbanktabellen gelöscht, deren Wert mit dem des Elements "reservierung" übereinstimmen. Mit dem Wert des Elements "aus" kann gesteuert werden, aus welchen Reservierungsdatenbanktabellen außer _reservierung Datensätze gelöscht werden.

Mit dem Wert von "seite" kann gesteuert werden, auf welche Seite das Skript nach den Löschaktionen umleiten soll. Fehlt der Wert wird auf die Startseite des Anwendungssystems umgeleitet.

Reservierungen für Datenbanktabellen

Weitere Hinweise dazu enthält die Seite Datenbanktabellen

Reservierungen für Veränderungen an Personendaten

Detaillierte Informationen dazu enthält die Seite Personen-, Adress- und Organisationskonten.

zum Anfang

 

© zacher-info.de

- Seite zuletzt geändert: 24.04.2025 - Elisabeth Zacher