Sperren von Daten
Wenn Sie den gemeinsamen Zugriff auf Dateien zulassen, müssen Sie auch den Zugriff auf Daten regeln, indem Sie Tabellen und Datensätze sperren. Sperren bieten, im Gegensatz zu Zugriffsberechtigungen, sowohl langfristige als auch kurzfristige Kontrollmöglichkeiten über die Daten. Visual FoxPro stellt automatische wie auch manuelle Sperrmöglichkeiten bereit.
Sperren von Datensätzen im Vergleich zum Sperren von Tabellen
Durch das automatische oder manuelle Sperren eines Datensatzes wird verhindert, dass ein Benutzer in einen Datensatz schreibt, der aktuell von einem anderen Benutzer bearbeitet wird. Wird hingegen eine gesamte Tabelle gesperrt, so können andere Benutzer zwar nicht in diese Tabelle schreiben, haben jedoch Lesezugriff auf die Tabelle. Da mit dem Sperren von Tabellen verhindert wird, dass andere Benutzer die hierin befindlichen Datensätze aktualisieren können, sollte diese Funktion nur selten verwendet werden.
Automatisches Sperren im Vergleich zum manuellen Sperren
Neben dem Sperren von Datensätzen oder gesamten Tabellen müssen Sie auch entscheiden, ob die Sperrung automatisch oder manuell erfolgen soll. Bei vielen Visual FoxPro-Befehlen wird automatisch versucht, einen Datensatz oder eine Tabelle zu sperren, bevor der Befehl ausgeführt wird. Wurde der Datensatz oder die Tabelle erfolgreich gesperrt, wird der Befehl ausgeführt und die Sperre wieder aufgehoben.
Befehle, die Datensätze und Tabellen automatisch sperren
Befehl | Gesperrter Bereich |
---|---|
ALTER TABLE | Gesamte Tabelle |
APPEND | Tabellenvorspann |
APPEND BLANK | Tabellenvorspann |
APPEND FROM | Tabellenvorspann |
APPEND FROM ARRAY | Tabellenvorspann |
APPEND MEMO | Aktueller Datensatz |
BLANK | Aktueller Datensatz |
BROWSE, CHANGE und EDIT | Aktueller Datensatz und alle Datensätze aus Alias-Feldern in verbundenen Tabellen, nachdem die Bearbeitung eines Feldes begonnen hat |
CURSORSETPROP( ) | Abhängig von Parametern |
DELETE | Aktueller Datensatz |
DELETE NEXT 1 | Aktueller Datensatz |
DELETE RECORD n | Datensatz n |
DELETE Löschen von mehr als einem Datensatz | Gesamte Tabelle |
DELETE – SQL | Aktueller Datensatz |
GATHER | Aktueller Datensatz |
INSERT | Gesamte Tabelle |
INSERT – SQL | Tabellenvorspann |
MODIFY MEMO | Aktueller Datensatz bei Beginn der Bearbeitung |
READ | Aktueller Datensatz und alle Datensätze aus Alias-Feldern |
RECALL | Aktueller Datensatz |
RECALL NEXT 1 | Aktueller Datensatz |
RECALL RECORD n | Datensatz n |
RECALL Löschen von mehr als einem Datensatz rückgängig machen | Gesamte Tabelle |
REPLACE | Aktueller Datensatz und alle Datensätze aus Alias-Feldern |
REPLACE NEXT 1 | Aktueller Datensatz und alle Datensätze aus Alias-Feldern |
REPLACE RECORD n | Datensatz n und alle Datensätze aus Alias-Feldern |
REPLACE Ersetzen von mehr als einem Datensatz | Gesamte Tabelle und alle Dateien aus Alias-Feldern |
SHOW GETS | Aktueller Datensatz und alle Datensätze, auf die von Alias-Feldern verwiesen wird |
TABLEUPDATE( ) | Abhängig von Zwischenspeicherung |
UPDATE | Gesamte Tabelle |
UPDATE – SQL | Gesamte Tabelle |
Merkmale der Datensatzsperrung
Befehle, die versuchen, Datensätze zu sperren, sind weniger restriktiv als Befehle, die Tabellen sperren. Wenn Sie einen Datensatz sperren, können andere Benutzer immer noch Datensätze hinzufügen oder löschen. Wurde ein Datensatz oder eine Tabelle bereits von einem anderen Benutzer gesperrt, schlägt der Versuch, einen Datensatz oder eine Tabelle zu sperren, fehl. Befehle, die versuchen, den aktuellen Datensatz zu sperren, geben die Fehlermeldung "Datensatz wird von einer anderen Person verwendet" zurück, wenn der Datensatz nicht gesperrt werden kann.
Bei den Befehlen BROWSE, CHANGE, EDIT und MODIFY MEMO wird ein Datensatz erst dann gesperrt, wenn er tatsächlich bearbeitet wird. Wenn Sie Felder von Datensätzen in verknüpften Tabellen bearbeiten, werden die Sekundärdatensätze gesperrt, sofern möglich. Der Sperrversuch schlägt fehl, falls der aktuelle Datensatz oder einer der Sekundärdatensätze bereits von einem anderen Benutzer gesperrt wurde. Bei einem erfolgreichen Sperrversuch können Sie den Datensatz bearbeiten. Die Sperre wird aufgehoben, wenn Sie zu einem anderen Datensatz wechseln oder ein anderes Fenster aktivieren.
Merkmale der Vorspann- und Tabellensperrung
Mit einigen Visual FoxPro-Befehlen wird die gesamte Tabelle gesperrt, wohingegen andere nur den Tabellenvorspann sperren. Befehle, die die gesamte Tabelle sperren, sind weit reichender in ihrer Wirksamkeit als Befehle, die nur den Tabellenvorspann sperren. Wenn Sie den Tabellenvorspann sperren, können andere Benutzer zwar keine Datensätze hinzufügen, sie können jedoch weiterhin die in den Feldern befindlichen Daten ändern.
Benutzer können gemeinsam auf die Tabelle zugreifen, ohne dass dies einen Konflikt verursacht, wenn Sie den APPEND BLANK-Befehl ausgeben, es kann jedoch ein Fehler auftreten, wenn ein anderer Benutzer ebenfalls gerade einen leeren (BLANK) Datensatz an die Tabelle anfügt. Sie können die Fehlermeldung "Datei wird von einer anderen Person verwendet" abfangen, die zurückgegeben wird, wenn zwei oder mehr Benutzer gleichzeitig APPEND BLANK gleichzeitig ausführen. Befehle, die eine ganze Tabelle sperren, geben die Fehlermeldung "Datei wird von einer anderen Person verwendet" zurück, wenn die Tabelle nicht gesperrt werden kann. Um den Sperrversuch abzubrechen, drücken Sie ESC.
Beispiel: Automatische Sperrung
Im folgenden Beispiel sperrt der Benutzer automatisch den Tabellenvorspann, indem er Datensätze aus einer anderen Tabelle anhängt, obwohl customer
als gemeinsam verwendete Datei geöffnet wurde.
SET EXCLUSIVE OFF
USE customer
APPEND FROM oldcust FOR status = "OPEN"
Manuelles Sperren
Sie können einen Datensatz oder eine Tabelle mit Hilfe der Sperrfunktionen manuell sperren.
So sperren Sie einen Datensatz oder eine Tabelle manuell
Verwenden Sie einen der folgenden Befehle:
RLOCK() LOCK() FLOCK()
RLOCK( ) und LOCK( ) sind identisch und dienen zum Sperren von einem oder mehreren Datensätzen. FLOCK( ) dient zum Sperren einer Datei. Die Funktionen LOCK( ) und RLOCK( ) können auf einen Tabellenvorspann angewendet werden. Geben Sie 0 als den mit LOCK( ) oder RLOCK( ) zu sperrenden Datensatz an. Wenn sich beim Test herausstellt, dass der Vorspann nicht gesperrt ist, sperrt die Funktion den Vorspann und gibt Wahr (.T.) zurück.
Wenn Sie einen Datensatz oder eine Tabelle gesperrt haben, sollten Sie die Sperre mit dem UNLOCK-Befehl sobald wie möglich wieder aufheben, um auch anderen Benutzern den Zugriff wieder zu ermöglichen.
Mit diesen manuellen Sperrfunktionen werden die folgenden Aktionen durchgeführt:
Prüfen des Sperrstatus eines Datensatzes oder einer Tabelle.
Ergibt die Prüfung, dass der Datensatz nicht gesperrt ist, so wird der Datensatz oder die Tabelle gesperrt, und es wird Wahr (.T.) zurückgegeben.
Kann der Datensatz oder die Tabelle nicht gesperrt werden, erfolgt ein erneuter Versuch zum Sperren des Datensatzes oder der Tabelle, und zwar abhängig von der aktuellen Einstellung von SET REPROCESS.
Gibt Wahr (.T.) oder Falsch (.F.) zurück, um anzuzeigen, ob der Sperrversuch erfolgreich war.
Tipp Wenn Sie den Sperrstatus eines Datensatzes im Verlauf einer Sitzung prüfen möchten, ohne den Datensatz zu sperren, verwenden Sie die ISRLOCKED( )-Funktion oder die ISFLOCKED( )-Funktion
Schlägt der Versuch zum Sperren eines Datensatzes oder einer Tabelle fehl, kann mit Hilfe des SET REPROCESS-Befehls und der aktuellen Fehlerroutine ermittelt werden, ob ein erneuter Sperrversuch unternommen wird. SET REPROCESS beeinflusst das Ergebnis eines nicht erfolgreichen Sperrversuchs. Sie können mit SET REPROCESS die Anzahl der Sperrversuche festlegen oder die Dauer steuern, für wie lange ein Sperrversuch unternommen wird.
Manuelle Sperrung (Beispiel)
Im folgenden Beispiel wird die Tabelle customer
für den gemeinsamen Zugriff geöffnet und mit FLOCK( ) der Versuch zum Sperren der Tabelle unternommen. Nach erfolgreicher Sperrung der Tabelle wird mit REPLACE ALL jeder Datensatz in der Tabelle aktualisiert. Mit UNLOCK wird die Dateisperrung aufgehoben. Kann keine Sperrung erfolgen, weil die Datei oder ein darin befindlicher Datensatz bereits von einem anderen Benutzer gesperrt wurde, wird eine Meldung angezeigt.
SET EXCLUSIVE OFF
SET REPROCESS TO 0
USE customer && Open table shared
IF FLOCK()
REPLACE ALL contact ; && Replace and unlock
WITH UPPER(contact)
UNLOCK
ELSE && Output message
WAIT "File in use by another." WINDOW NOWAIT
ENDIF
Aufheben von Datensperren
Nachdem Sie in einer Mehrbenutzerumgebung einen Datensatz oder eine Datei gesperrt und die gewünschte Datenoperation erfolgreich durchgeführt haben, sollten Sie die Sperrung so schnell wie möglich wieder aufheben. Sperrungen können auf verschiedene Weisen wieder aufgehoben werden. In einigen Fällen wird die Sperrung bereits aufgehoben, wenn Sie einfach zum nächsten Datensatz wechseln. In anderen Fällen müssen explizite Befehle gegeben werden.
Um die Sperrung eines Datensatzes aufzuheben, der automatisch gesperrt wurde, müssen Sie lediglich den Datensatzzeiger verschieben, auch wenn MULTILOCKS auf ON gesetzt wurde. Wenn Sie einen Datensatz jedoch manuell gesperrt haben, müssen Sie die Sperrung auch explizit wieder aufheben; hierbei reicht ein Verschieben des Datensatzzeigers nicht aus.
Die Auswirkungen, die die einzelnen Befehle auf manuell und automatisch gesperrte Datensätze und Tabellen haben, werden in der folgenden Tabelle beschrieben.
Befehl | Auswirkung |
---|---|
UNLOCK | Hebt die Sperrung von Datensätzen und Dateien im aktuellen Arbeitsbereich auf. |
UNLOCK ALL | Hebt alle Sperrungen in allen Arbeitsbereichen für die aktuelle Sitzung auf. |
SET MULTILOCKS OFF | Aktiviert die automatische Aufhebung der aktuellen Sperrung, sobald eine neue Sperrung vorgenommen wird. |
FLOCK( ) | Hebt alle Datensatzsperrungen in der entsprechenden Datei auf, bevor die Datei als solche gesperrt wird. |
CLEAR ALL, CLOSE ALL, USE, QUIT |
Hebt alle Datensatz- und Dateisperrungen auf. |
END TRANSACTION | Hebt alle automatischen Sperrungen auf. |
TABLEUPDATE( ) | Hebt alle Sperrungen auf, nachdem die Tabelle aktualisiert wurde. |
Vorsicht Wenn ein Datensatz mit einer benutzerdefinierten Funktion automatisch gesperrt wurde und Sie den Datensatzzeiger aus dem Datensatz und anschließend wieder zurück auf den Datensatz verschieben, wird die Sperrung aufgehoben. Sie umgehen dieses Problem, indem Sie mit Tabellenpufferung (Zwischenspeicherung) arbeiten.
Siehe auch
Steuern des Zugriffs auf Daten | Verwenden von Datensitzungen | Programmieren für freigegebenen Zugriff | RLOCK( ) | LOCK( ) | FLOCK( ) | UNLOCK