Datensatz sperren

4D - Documentation   Français   English   German   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next

Version 3


4th Dimension und 4D Server/4D Client verwalten die Datenbanken automatisch bei Mehrfachbenutzung. Zwei Benutzer bzw. zwei Prozesse können nicht gleichzeitig denselben Datensatz oder dasselbe Objekt ändern. Der zweite Benutzer bzw. Prozess kann zur selben Zeit nur im Lesemodus darauf zugreifen.

Multi-User Befehle bieten sich an, wenn Sie:

 Datensätze per Programmierung ändern.

 Eine eigene Benutzeroberfläche für Operationen im Mehrplatzbetrieb einsetzen.

 Verknüpfte Änderungen innerhalb einer Transaktion sichern.

Setzen Sie eine Datenbank in der Multiprozess-Umgebung ein, müssen Sie folgendes beachten:

 Jede Tabelle befindet sich entweder im Lesemodus oder im Lese-/Schreibmodus.

Geladene Datensätze werden gesperrt, abgelegte Datensätze werden wieder freigegeben.

 Ein gesperrter Datensatz kann nicht geändert werden.

In den folgenden Abschnitten gilt folgende Sprachregelung:

Die Person, die eine Operation in der Datenbank im Mehrplatzbetrieb ausführt, wird lokaler Benutzer genannt. Die anderen Benutzer der Datenbank werden andere Benutzer genannt. Analog dazu wird der Prozess, der in der Multiprozessumgebung eine Operation ausführt, laufender Prozess genannt. Alle anderen Prozesse in Ausführung werden andere Prozesse genannt. Die Erläuterungen erfolgen aus der Sicht des lokalen Benutzers und des laufenden Prozesses.

Gesperrte Datensätze


Eine gesperrter Datensatz kann weder vom lokalen Benutzer noch vom laufenden Prozess geändert werden. Er kann geladen, jedoch nicht geändert werden. Ein Datensatz ist gesperrt, sobald einer der anderen Benutzer oder Prozesse diesen im Lese-/Schreibmodus geladen hat. Nur der Benutzer, der den Datensatz ändern kann, sieht ihn als nicht gesperrt. Für alle anderen Benutzer und Prozesse erscheint dieser Datensatz als gesperrt. Sie können keine Änderungen vornehmen. Der Datensatz hat nur dann den Status nicht gesperrt, wenn die dazuhörige Tabelle im Lese-/Schreibmodus ist.

Zugriffsart auf Datensätze


Die Zugriffsart auf Dateien legen Sie fest mit den Befehlen READ ONLY und READ/WRITE.

Diese Befehle sind gleichwertig. READ/WRITE hat keine Priorität. Sie müssen diese Befehle vor dem Laden des Datensatzes ausführen. Rufen Sie Datensätze mit READ/WRITE auf, müssen Sie trotzdem mit der Funktion Locked prüfen, ob ein Datensatz schon von einem anderen Prozess bearbeitet wird.

Mit READ ONLY können Sie Datensätze einer Tabelle im Lesemodus laden. Sie dürfen die Datensätze weder ändern noch löschen. Sie können sie aber lesen, drucken, sortieren usw.. Mit diesem Befehl geladene Datensätze sind immer gesperrt. Dadurch vermeiden Sie, dass unnötig Datensätze gesperrt werden, die Sie nicht ändern wollen.

READ ONLY gilt nur für die Bearbeitung bereits vorhandener Datensätze. Sie können einer Tabelle im Lesemodus jederzeit neue Datensätze hinzufügen.

Mit READ/WRITE teilen Sie 4th Dimension mit, dass Sie Datensätze laden wollen, die Sie bearbeiten möchten. Nur der aktuelle Datensatz ist dabei gesperrt. READ/WRITE garantiert nicht, dass Sie alle geladenen Datensätze bearbeiten können.

Beim Laden des Datensatzes gibt es zwei Möglichkeiten:

Der geladene Datensatz wird schon von einem anderen Prozess bearbeitet. Dieser Datensatz ist dann gesperrt, obwohl Sie ihn mit READ WRITE geladen haben. 4D vermeidet damit, dass Datensätze gleichzeitig bearbeitet werden können. Haben Sie die Befehle MODIFY RECORD oder MODIFY SELECTION benutzt, meldet 4th Dimension, dass ein Datensatz gesperrt ist. In allen anderen Fällen müssen Sie den Zustand des Datensatzes mit der Funktion Locked abfragen.

Der geladene Datensatz wird von keinem anderen Prozess bearbeitet. In diesem Fall ist der Datensatz für die Bearbeitung frei.

Hinweis: Beim Öffnen der Datenbank sind alle Dateien im Lese-/Schreibmodus. Jeder Prozess hat seinen eigenen Nur Lesen bzw. Lese-/Schreibmodus für jede Tabelle in der Datenbank.

Über die Funktion Read only state können Sie jederzeit den Status einer Tabelle herausfinden.

Befehle, die einen Datensatz zum Lesen laden

Die unten aufgeführten Befehle rufen die Datensätze nur zum Lesen, nicht zum Schreiben auf. Sie sollten daher ihre Zugriffsart auf die Datenbank mit dem Befehl READ ONLY definieren. Die geladenen Datensätze werden für andere Prozesse nicht unnötig gesperrt. Ein anderer Prozess kann sie weiter bearbeiten. Die Datenbank wird optimal ausgenützt.

DISPLAY SELECTION

DISTINCT VALUES

EXPORT DIF

EXPORT SYLK

EXPORT TEXT

GRAPH TABLE

PRINT SELECTION

PRINT LABEL

QR REPORT

SELECTION TO ARRAY

SELECTION RANGE TO ARRAY

4th Dimension sichert den aktuellen Status der Tabelle (Lesemodus oder Lese-/Schreibmodus) für den laufenden Prozess vor der Ausführung einer dieser Befehle. Dieser Status wird nach Ausführung des Befehls wiederhergestellt.

Andere Benutzer können jedoch in der Tabelle Datensätze hinzufügen, entweder mit den Befehlen CREATE RECORD oder ADD RECORD oder manuell in der Benutzerumgebung.

Datensätze ändern, aktualisieren, löschen


Zwei Prozesse dürfen nicht zur gleichen Zeit denselben Datensatz bearbeiten. Würde die Datenbank dies zulassen, würden die Eingaben des einen Datensatzes durch die gleichzeitigen Eingaben des anderen Datensatzes verfälscht.

Der zweite Prozess muss daher solange warten, bis die Eingaben des ersten Prozesses bestätigt wurden. Zwei Prozesse ändern also nicht gleichzeitig einen Datensatz. Sie tun es der Reihe nach. Dies gilt nicht nur für Änderungen des Datensatzes, sondern analog auch für das Löschen.

Wollen Sie einen Datensatz bearbeiten oder löschen, obwohl Sie ihn nur lesen dürfen, führt 4th Dimension Ihre Anweisung nicht aus, um jeden Konflikt zu vermeiden.

Beim Programmieren einer multitasking-fähigen Datenbank müssen Sie also immer darauf achten, wann Sie Datensätze ändern können und wann nicht.

Folgendes Beispiel verdeutlicht dies:

Prozess A ändert den Datensatz MÜLLER der Tabelle [Kunden].

Prozess B erstellt Rechnungen aus Proforma-Rechnungen.

Logischerweise kann der Prozess B die Rechnung erst dann erstellen, wenn der Umsatz von MÜLLER in der Tabelle [Kunden] aktualisiert wurde. Prozess B muss also auf die Freigabe des Datensatzes durch Prozess A warten.

Diese Abhängigkeiten müssen Sie in jedem Fall beachten. Nur dann kann die Konsistenz der Daten gewährleistet sein. Es darf kein Unterschied entstehen zwischen der Rechnungssumme und den Umsatzzahlen für Herrn MÜLLER. Die Übereinstimmung der entsprechenden Daten in der Tabelle [Kunden] und der Tabelle [Rechnungen] wäre sonst nicht gewährleistet.

Zustandsabfrage des Datensatzes

Mit der Funktion Locked können Sie den Zustand des aktuellen Datensatzes abfragen.

Wurde der Datensatz im Nur Lesen-Modus geladen, gibt Locked den Wert TRUE zurück.

Wurde der Datensatz im Lese-/Schreibmodus geladen, wird aber schon von einem anderen Prozess bearbeitet, gibt Locked ebenfalls den Wert TRUE zurück.

Wurde der Datensatz im Lese-/Schreibmodus geladen und er wird von keinem anderen Prozess bearbeitet, gibt Locked den Wert FALSE zurück.

Mit dem Befehl LOCKED ATTRIBUTES können Sie feststellen, welcher Benutzer und/oder Prozess einen Datensatz gesperrt hat.

Datensatz freigeben

4th Dimension gibt den Datensatz beim Wechsel des aktuellen Datensatzes frei. Wollen Sie den aktuellen Datensatz nicht sofort ändern, können Sie ihn mit dem Befehl UNLOAD RECORD freigeben. Dieser Befehl gibt den aktuellen Datensatz sowie seinen Platz im Hauptspeicher frei.

Um sicher zu gehen, dass Sie einen Datensatz im Lese-/Schreibmodus erhalten, führen Sie nacheinander folgende Operationen durch:

Greifen Sie auf die Tabelle mit dem Befehl READ WRITE zu.

Rufen Sie den gewünschten Befehl auf, der den Datensatz zum ersten Mal lädt, beispielsweise NEXT RECORD, QUERY, ORDER BY, RELATE ONE.

Prüfen Sie mit der Funktion Locked den Zustand des Datensatzes.

Ist der Datensatz gesperrt, rufen Sie mit den Befehl LOAD RECORD den Datensatz so lange auf, bis Locked den Wert FALSE zurückgibt.

Ändern Sie den Datensatz.

Sichern Sie ihn und geben ihn dann frei, indem Sie den aktuellen Datensatz wechseln oder mit dem Befehl UNLOAD RECORD freigeben.

Hinweis: Löschen Sie einen Datensatz, brauchen Sie UNLOAD RECORD natürlich nicht mehr aufrufen, da der Datensatz ja nicht mehr existiert.

Schleifen zum Laden freigegebener Datensätze


Folgendes Beispiel zeigt die einfachste Schleife zum Laden eines ungesperrten Datensatzes:

   READ WRITE ([Customers])  ` Setze Tabelle auf Lese-/Schreibmodus
   Repeat  ` Durchlaufe Schleife, bis Datensatz freigegeben ist
      LOAD RECORD ([Customers])  ` Lade Datensatz und setze Status gesperrt
   Until (Not (Locked([Customers])))
      ` Bearbeite diesen Datensatz
   READ ONLY ([Customers])  ` Setze Tabelle auf Nur Lesen

Die Schleife läuft solange, bis der Datensatz freigegeben ist.

Diese Schleife wird nur verwendet, wenn Sie davon ausgehen können, dass der Datensatz nicht durch jemand anderen gesperrt ist. Denn der Benutzer muss das Beenden der Schleife abwarten. Der Fall ist relativ unwahrscheinlich, da der Datensatz nur über eine Methode geändert werden kann.

Folgendes Beispiel verwendet die obige Schleife, um einen ungesperrten Datensatz zu laden und anschließend zu ändern:

   READ WRITE([Inventory])
   Repeat  ` Durchlaufe Schleife, bis Datensatz freigegeben ist
      LOAD RECORD([Inventory])  ` Lade Datensatz und setze Status gesperrt
   Until (Not (Locked([Inventory])))
   [Inventory]Part Qty := [Inventory]Part Qty – 1  ` Ändere Datensatz
   SAVE RECORD ([Inventory])  ` Sichere Datensatz
   UNLOAD RECORD ([Inventory])  ` Laß andere Benutzer den Datensatz ändern
   READ ONLY([Inventory])

Der Befehl MODIFY RECORD zeigt dem Benutzer automatisch an, ob der Datensatz gesperrt ist und unterbindet so eine Änderung. Folgendes Beispiel umgeht diese automatische Anzeige durch den Test mit der Funktion Locked. Ist der Datensatz gesperrt, kann der Benutzer abbrechen.

Dieses Beispiel prüft in optimaler Weise, ob der aktuelle Datensatz für die Tabelle [Commands] gesperrt ist. Wenn ja, wird der Prozess von der Methode um eine Sekunde verschoben. Diese Technik können Sie sowohl in der Multi-User- als auch in der Multiprozessumgebung einsetzen:

   Repeat
      READ ONLY([Commands]) ` Sie benötigen Lese-/Schreibmodus gerade nicht
      QUERY([Commands])
         ` Wurde die Suche abgeschlossen und einige Datensätze zurückgegeben
      If ((OK=1) & (Records in selection([Commands])>0))
         READ WRITE([Commands]) ` Setze Tabelle auf Lese-/Schreibmodus
         LOAD RECORD([Commands])
         While (Locked([Commands]) & (OK=1)) `Ist der Datensatz gesperrt,
               ` durchlaufe Schleife, bis Datensatz freigegeben ist 
               ` Wer sperrt den Datensatz?
            LOCKED ATTRIBUTES([Commands];$Process;$User;$Machine;$Name)
            If ($Process=-1) ` Wurde der Datensatz gelöscht?
               ALERT("Datensatz wurde inzwischen gelöscht.")
               OK:=0
            Else
               If ($User="") ` Sind Sie im Einzelplatzbetrieb
                  $User:="Ihnen"
               End if
               CONFIRM("Datensatz wird bereits von "+$User+" im Prozess
                                           "+$Name+" verwendet.")
               If (OK=1) ` Wollen Sie ein paar Sekunden warten?
                  DELAY PROCESS(Current process;120) 
                                    ` Warten Sie ein paar Sekunden 
                  LOAD RECORD([Commands])` Versuchen Sie, Datensatz zu laden.
               End if
            End if
         End while
         If (OK=1) ` Datensatz ist freigegeben
            MODIFY RECORD([Commands]) ` Sie können Datensatz ändern
            UNLOAD RECORD([Commands])
         End if
         READ ONLY([Commands]) ` Wechsle wieder in Modus Nur Lesen
         OK:=1
      End if
   Until (OK=0)

Befehle im Mehrplatzbetrieb bzw. in der Multiprozessumgebung


Ein Reihe von Befehlen der Programmiersprache arbeiten bei ungesperrten Datensätzen normal. Treffen sie auf einen gesperrten Datensatz, führen sie ganz bestimmte Aktionen aus. Es handelt sich um folgende Befehle:

MODIFY RECORD: Meldet, dass der Datensatz bereits benutzt wird. Der Datensatz wird nicht angezeigt, der Benutzer kann ihn also nicht ändern. In der Benutzerumgebung erscheint der Datensatz im Modus Nur Lesen.

MODIFY SELECTION: Arbeitet normal, durch Doppelklick kann der Benutzer den Datensatz ändern. Ist er gesperrt, meldet MODIFY SELECTION, dass der Datensatz bereits benutzt wird. Der Datensatz ist dann nur im Modus Nur Lesen verfügbar

 APPLY TO SELECTION: Lädt einen gesperrten Datensatz, ändert ihn jedoch nicht. Mit APPLY TO SELECTION können Sie so Informationen ohne Risiko aus Tabellen auslesen. Gesperrte Datensätze werden in der Menge LockedSet abgelegt.

 DELETE SELECTION: Löscht keine gesperrten Datensätze; sie werden übersprungen. Gesperrte Datensätze werden in der Menge LockedSet abgelegt.

DELETE RECORD: Wird bei gesperrtem Datensatz nicht ausgeführt. Es erscheint keine Fehlermeldung. Sie müssen vor Ausführung dieses Befehls prüfen, ob der Datensatz freigegeben ist.

 SAVE RECORD: Wird bei gesperrtem Datensatz nicht ausgeführt. Es erscheint keine Fehlermeldung. Sie müssen vor Ausführung dieses Befehls prüfen, ob der Datensatz freigegeben ist.

ARRAY TO SELECTION: Sichert keine gesperrten Datensätze. Gesperrte Datensätze werden in der Menge LockedSet abgelegt.

GOTO RECORD: In einer Datenbank in der Multi-User-/Multiprozess-Umgebung können andere Benutzer Datensätze löschen bzw. hinzufügen. So können sich auch die Datensatznummern verändern. Seien Sie also vorsichtig, wenn Sie im Mehrplatzbetrieb auf einen Datensatz über seine Nummer zugreifen.

Mengen: Behandeln Sie Mengen mit Vorsicht, da andere Benutzer oder Prozesse die darin enthaltenen Informationen bereits geändert haben können.

Referenz

LOAD RECORD, Locked, LOCKED ATTRIBUTES, Methoden, READ ONLY, Read only state, READ WRITE, UNLOAD RECORD, Variablen.


4D - Documentation   Français   English   German   4D Programmiersprache, Befehle nach Themen   4D Programmiersprache, Befehle alphabetisch   4D Programmiersprache, Konstanten nach Themen   Back   Previous   Next