4D v16.3

Überblick zu Datensatz sperren

Home

 
4D v16.3
Überblick zu Datensatz sperren

Überblick zu Datensatz sperren  


 

 

4D und 4D Server 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:

  • In einem Prozess ist jede Tabelle 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 verwenden wir die Begriffe wie folgt:
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, aktueller Prozess genannt. Alle anderen Prozesse in Ausführung werden andere Prozesse genannt. Die Erläuterungen erfolgen aus der Sicht des lokalen Benutzers und des aktuellen Prozesses.

Ein 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 oder der Datensatz gestapelt ist. Nur der Benutzer, der den Datensatz ändert, 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 dazugehörige Tabelle im Lese-/Schreibmodus ist.

Jede Tabelle in einer Anwendung ist entweder im Lese-/Schreibmodus oder Nur-Lesen für jeden Benutzer und jeden Prozess der Datenbank. Nur-Lesen bedeutet, dass die Datensätze einer Tabelle geladen, aber nicht geändert werden können. Lesen/Schreiben bedeutet, dass Datensätze für die Tabelle geladen und geändert werden können, wenn kein anderer Benutzer den Datensatz zuvor gesperrt hat.
Wenn Sie den Status einer Tabelle ändern, wirkt sich die Änderung auf den nächsten geladenen Datensatz aus. Sie gilt nicht für den aktuell geladenen Datensatz

Ist eine Tabelle im Modus Nur-Lesen und wird ein Datensatz geladen, ist der Datensatz immer gesperrt, d.h. er lässt sich anzeigen, drucken oder anderweitig nutzen, aber nicht verändern.

Der Status Nur-Lesen gilt nur für das Bearbeiten vorhandener Datensätze, er hat keine Auswirkung auf das Erstellen neuer Datensätze. In einer Tabelle im Modus Nur-Lesen können Sie Datensätze über die Befehle CREATE RECORD und ADD RECORD oder über die Menübefehle der Designumgebung hinzufügen. Diese neu erstellten Datensätze sind dann für alle anderen Benutzer bzw. Prozesse gesperrt. Beachten Sie, dass der Nur-Lesen Status nicht für den Befehl ARRAY TO SELECTION gilt, da er Datensätze erstellen und ändern kann.

4D setzt eine Tabelle für Befehle, die keinen Schreibzugriff auf Datensätze benötigen, automatisch auf Nur-Lesen. Das sind folgende Befehle: DISPLAY SELECTION, DISTINCT VALUES, EXPORT DIF, EXPORT SYLK, EXPORT TEXT, _o_GRAPH TABLE, PRINT SELECTION, PRINT LABEL, QR REPORT, SELECTION TO ARRAY, SELECTION RANGE TO ARRAY.

Den Status einer Tabelle können Sie jederzeit mit der Funktion Read only state herausfinden.

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

Ist eine Tabelle im Lese-/Schreibmodus und wird ein Datensatz geladen, wird der Datensatz entsperrt, wenn ihn zuvor kein anderer Benutzer gesperrt hat. Ist der Datensatz von einem anderen Benutzer gesperrt, wird er als gesperrt geladen und kann vom lokalen Benutzer nicht verändert werden.

Eine Tabelle muss in den Lese-/Schreibmodus gesetzt werden, damit der geladene Datensatz entsperrt wird und änderbar ist.

Lädt ein Benutzer einen Datensatz von einer Tabelle im Lese-/Schreibmodus, kann kein anderer Benutzer diesen Datensatz zum Ändern laden. Er kann jedoch in der Tabelle Datensätze hinzufügen, entweder über die Befehle CREATE RECORD und ADD RECORD oder manuell in der Designumgebung.

Alle Tabellen sind standardmäßig im Lese-/Schreibmodus, wenn eine Datenbank geöffnet und ein neuer Prozess gestartet wird.

Sie können den Status einer Tabelle über die Befehle READ ONLY und READ WRITE ändern. Wollen Sie den Status einer Tabelle ändern, um einen Datensatz auf Nur-Lesen oder Lesen/Schreiben zu setzen, müssen Sie den Befehl vor Laden des Datensatzes ausführen. Die Befehle READ ONLY und READ WRITE gelten nicht für den bereits geladenen Datensatz.

Jeder Prozess hat seinen eigenen Status (Nur-Lesen oder Lesen/Schreiben) für jede Tabelle in der Datenbank.

Standardmäßig, also ohne Verwenden von READ ONLY, sind alle Tabellen im Modus Lesen/Schreiben.

Bevor ein lokaler Benutzer einen Datensatz ändern kann, muss die Tabelle im Status Lesen/Schreiben sein und der Datensatz geladen und entsperrt sein.

Jeder Befehl, der einen aktuellen Datensatz (sofern vorhanden) lädt, wie NEXT RECORD, QUERY, ORDER BY, RELATE ONE, etc., setzt den Datensatz auf gesperrt oder entsperrt. Der Datensatz wird gemäß dem aktuellen Status seiner Tabelle (Nur-Lesen oder Lesen/Schreiben) und seiner Verfügbarkeit geladen. Es kann auch ein Datensatz einer verknüpften Tabelle geladen werden, wenn einer der Befehle eine automatische Verknüpfung auslöst.

Ist eine Tabelle im Nur-Lesen Status für einen Prozess oder einen Benutzer, werden die Datensätze dieser Tabelle im Nur-Lesen Modus geladen, d.h. sie können von diesem Prozess oder Benutzer weder geändert, noch gelöscht werden. Dies wird zum Ansehen oder Finden von Daten empfohlen, da so andere Benutzer bzw. Prozesse weiterhin im Lese-/Schreibmodus auf die Datensätze zugreifen können.

Ist eine Tabelle im Lesen/Schreiben Status für einen Prozess oder einen Benutzer, wird jeder Datensatz dieser Tabelle im Modus Lesen/Schreiben geladen, wenn ihn nicht bereits ein anderer Benutzer bzw. Prozess gesperrt hat. Wurde ein Datensatz erfolgreich im Lesen/Schreiben Status geladen, wird er für den aktuellen Prozess bzw. Benutzer entsperrt, d.h. er lässt sich ändern und sichern. Für alle anderen Benutzer oder Prozesse ist er gesperrt.

Eine Tabelle muss in den Lesen/Schreiben Status gesetzt werden, bevor ein Datensatz zum Ändern geladen und dann gesichert wird.

  • 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: Wird UNLOAD RECORD in einer Transaktion verwendet, entsperrt er den aktuellen Datensatz nur für den Prozess, der diese Transaktion verwaltet. Für andere Prozesse bleibt der Datensatz gesperrt, bis die Transaktion bestätigt oder annulliert wurde.

Verwenden Sie den Befehl LOCKED BY, um feststellen, welcher Benutzer bzw. Prozess einen Datensatz gesperrt hat.

Hinweis: Eine gute Praxis ist, beim Starten eines Prozesses alle Tabellen in den Modus Nur-Lesen zu setzen (mit der Syntax READ ONLY(*)) und jede Tabelle nur bei Bedarf in den Modus Lesen/Schreiben zu setzen. Der Zugriff auf Tabellen im Nur-Lesen Modus ist schneller und effizienter für den Speicher. Außerdem ist der Status einer Tabelle im Client/Server Modus optimiert, da er keinen zusätzlichen Netzwerkverkehr verursacht: Information wird nur beim Ausführen eines Befehls an den Server gesendet, der entsprechenden Zugriff auf die Tabelle benötigt.

Folgendes Beispiel zeigt die einfachste Schleife zum Laden eines nicht-gesperrten 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]) ` Lass 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 BY([Commands];$Process;$User;$SessionUser;$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)

Ein Reihe von Befehlen der Programmiersprache arbeiten bei nicht-gesperrten 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. Weitere Informationen dazu finden Sie im Abschnitt Einführung in Mengen



Siehe auch 

LOAD RECORD
Locked
LOCKED BY
Methoden
READ ONLY
Read only state
READ WRITE
UNLOAD RECORD
Variablen

 
EIGENSCHAFTEN 

Produkt: 4D
Thema: Datensatz sperren

 
GESCHICHTE 

 
ARTIKELVERWENDUNG

4D Programmiersprache ( 4D v16)
4D Programmiersprache ( 4D v16.1)
4D Programmiersprache ( 4D v16.2)
4D Programmiersprache ( 4D v16.3)