LOCK( )-Funktion
Versucht, einen oder mehrere Datensätze einer Tabelle zu sperren.
LOCK([nWorkArea | cTableAlias]|
[cRecordNumberList, nWorkArea | cTableAlias])
Rückgabewerte
Logisch
Parameter
nWorkArea cTableAlias
Versucht, den aktuellen Datensatz einer Tabelle zu sperren, die in einem bestimmten Arbeitsbereich geöffnet ist. nWorkArea gibt die Nummer des Arbeitsbereichs, cTableAlias den Alias der Tabelle an. Wird kein Arbeitsbereich oder TabellenAlias angegeben, versucht LOCK( ), den aktuellen Datensatz der im aktuellen Arbeitsbereich geöffneten Tabelle zu sperren.cRecordNumberList
Gibt eine Liste mit einer oder mehreren Datensatznummern an, die zum Sperren mehrerer Datensätze einbezogen werden müssen. Zum Sperren muss SET MULTILOCKS auf ON eingestellt und der Arbeitsbereich oder der Alias der Tabelle angegeben werden.LOCK( ) versucht, alle angegebenen Datensätze zu sperren. Die in cRecordNumberList angegebenen Datensatznummern sind durch Kommas zu trennen. Sollen z. B. die ersten vier Datensätze einer Tabelle gesperrt werden, muss cRecordNumberList '1,2,3,4' enthalten.
Sie können auch mehrere Datensätze sperren, indem Sie den Datensatzzeiger auf den zu sperrenden Datensatz bewegen, LOCK( ) oder RLOCK( ) ausgeben und anschließend diese Schritte für jeden weiteren Datensatz wiederholen.
In Visual FoxPro können Sie 0 als Datensatznummer angeben. Bei Angabe von 0 können Sie versuchen, den Tabellenkopf sperren.
Anmerkung Lassen Sie einen Tabellenkopf nur möglichst kurze Zeit gesperrt, da andere Benutzer sonst der Tabelle keine Datensätze hinzufügen können.
Die Sperre eines Tabellenkopfes können Sie mit UNLOCK RECORD 0, UNLOCK oder UNLOCK ALL freigeben.
Wurden alle in cRecordNumbers angegebenen Datensätze erfolgreich gesperrt, gibt LOCK( ) Wahr (.T.) zurück. Kann auch nur einer der in cRecordNumbers angegebenen Datensätze nicht gesperrt werden, gibt LOCK( ) Falsch (.F.) zurück, und es können keine Sätze gesperrt werden. Vorhandene Satzsperren bleiben jedoch erhalten. Das Sperren mehrerer Datensätze ist ein Prozess, der zusätzliche Satzsperren hinzufügt. Das Hinzufügen zusätzlicher gesperrter Datensätze gibt jedoch keine Sperren anderer Datensätze frei.
Die maximale Zahl von Datensätzen, die in jedem Arbeitsbereich gesperrt werden können, beträgt ungefähr 8.000. Grundsätzlich ist das Sperren einer ganzen Tabelle schneller als das Sperren einer noch so kleinen Zahl von Datensätzen.
Hinweise
LOCK( ) ist identisch mit RLOCK( ).
Wurde(n) die Sperre(n) erfolgreich gesetzt, gibt LOCK( ) Wahr (.T.) zurück. Der Benutzer, der die Sperren einrichtet, hat Schreib- und Lesezugriff auf die gesperrten Datensätze. Alle übrigen Benutzer im Netzwerk haben Lesezugriff.
Das Ausführen von LOCK ( ) bedeutet nicht, dass die Satzsperren oder Sperren erfolgreich gesetzt werden. Eine Datensatzsperre kann nicht auf einen bereits von einem anderen Benutzer gesperrten Datensatz oder in eine von einem anderen Benutzer gesperrte Tabelle gesetzt werden. Können ein oder mehrere Datensätze aus irgendeinem Grund nicht gesperrt werden, gibt LOCK( ) Falsch (.F.) zurück.
Standardmäßig versucht LOCK( ) nur einmal, einen Datensatz zu sperren. Bei Angabe von SET REPROCESS wird die Sperrung eines Satzes beim Fehlschlagen des ersten Versuchs automatisch wiederholt. Ist der erste Versuch fehlgeschlagen, bestimmt SET REPROCESS die Anzahl der Sperrversuche oder die Zeitdauer, innerhalb derer weitere Sperrversuche unternommen werden. Weitere Informationen finden Sie unter SET REPROCESS.
SET MULTILOCKS bestimmt, ob in einer Tabelle mehrere Datensätze gesperrt werden können. Ist SET MULTILOCKS auf OFF festgelegt (Standard), kann in einer Tabelle nur ein Datensatz gesperrt werden. Bei Festlegen auf ON können mehrere Datensätze gesperrt werden. Weitere Informationen finden Sie in der Hilfe unter SET MULTILOCKS.
Freigeben von Datensätzen Ein Datensatz kann nur von dem Benutzer freigegeben werden, der ihn gesperrt hat. Sie können gesperrte Datensätze durch Ausgeben von UNLOCK, Schließen der Tabelle oder Beenden von Visual FoxPro freigeben.
Mit UNLOCK können gesperrte Datensätze im aktuellen Arbeitsbereich, in einem bestimmten Arbeitsbereich oder in allen Arbeitsbereichen freigegeben werden. Weitere Informationen finden Sie unter UNLOCK.
Wenn Sie SET MULTILOCKS von ON auf OFF oder umgekehrt umschalten, wird UNLOCK ALL durchgeführt und alle gesperrten Datensätze in allen Arbeitsbereichen werden freigegeben.
Tabellen können mit USE, CLEAR ALL oder CLOSE DATABASES geschlossen werden.
Weitere Informationen zum Sperren von Datensätzen und Dateien sowie zum Freigeben von Tabellen in einem Netzwerk finden Sie unter Programmieren für freigegebenen Zugriff.
Beispiel
Im folgenden Beispiel werden die ersten vier Datensätze in den Tabellen customer
und employee
freigegeben.
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SET REPROCESS TO 3 AUTOMATIC
STORE '1,2,3,4' TO gcRecList
gcOldExc = SET('EXCLUSIVE')
SET EXCLUSIVE OFF
SELECT 0
USE employee && Open Employee table
SELECT 0
USE customer && Open Customer table
? LOCK('1,2,3,4', 'customer') && Lock 1st 4 records in customer
? RLOCK(gcRecList, 'employee') && Lock 1st 4 records in employee
UNLOCK IN customer
UNLOCK IN employee
SET EXCLUSIVE &gcOldExc
Siehe auch
CLEAR | CLOSE | FLOCK( ) | RLOCK( ) | SET MULTILOCKS | SET REPROCESS | UNLOCK | USE