4D v16.3Überblick zu Datensatz sperren |
||
|
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:
Setzen Sie eine Datenbank in der Multiprozess-Umgebung ein, müssen Sie folgendes beachten:
In den folgenden Abschnitten verwenden wir die Begriffe wie folgt: 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. 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.
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 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]) 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 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:
Siehe auch
LOAD RECORD
|
EIGENSCHAFTEN
Produkt: 4D
GESCHICHTE
ARTIKELVERWENDUNG
4D Programmiersprache ( 4D v16) |