Funktion
Themenkomplex Tabellen-Funktionen
Funktion lock()
Kurz Tabellensperre einrichten
Syntax LOCK(db : INTEGER; Sperre : INTEGER; Modus : INTEGER) : INTEGER
Parameter db : Tabellenhandle

Sperre:
0 : Schreibsperre
1 : Totalsperre

Modus:
0 : Sperre wird unbedingt eingerichtet; Programm wartet
1 : Sperre wird eingerichtet, wenn möglich; Programm wartet nicht
Ergebnis 1 : Sperre ist eingerichtet
0 : Sperre ist nicht eingerichtet
Siehe auch:
unlock()
Beschreibung

Die Funktion Lock dient dem Setzen der elementaren Schreib- beziehungsweise Totalsperre. Lock sollte immer dann benutzt werden, wenn Zugriffe auf Datenbankdateien über mehrere einzelne prgs erfolgen, die ihrerseits wiederum Sperren setzen und wieder aufheben (z.B. WriteRec). Durch Lock ist es nun möglich, zu Beginn der komplexen Datenbankzugriffe einmal die erforderliche Sperre einzurichten, die prgs abzuarbeiten und die Sperre mit Unlock wieder aufzuheben. Dies bringt im Netz nicht nur eine erhöhte Sicherheit, sondern auch eine gesteigerte Performance.

Hinweis: Jede erfolgreich eingerichtete Sperre muss mit Unlock wieder aufgehoben werden.

Das folgende Beispiel zeigt bereits den Sinn von Lock.  Unter Umständen muß ein gesicherter Datensatz wieder gelesen werden. Im ungünstigsten Fall wird zwischen dem Sichern der Satznummer in nSaveRec und dem Zurücksetzen des Satzzeigers mit ReadRec(KUNDE, nSaveRec) der Datensatz von einem anderen prg entfernt.
Somit wäre ein sicheres Lesen des alten Datensatzes gefährdet. Daher sollten solche Vorgänge immer von Lock und Unlock umgeben sein.


Beispiel 1: Lock



PROCEDURE FindName(cSuch: String): INTEGER;
VAR nSaveRec, nret, KUNDE : INTEGER;
	KUNDE:=OpenDB('kunde.dat');
	Lock(KUNDE, 0);
	nSaveRec := RecNo(KUNDE);
	ReadRec(KUNDE, FINDREC(KUNDE, cSuch));
	IF NOT GetField(KUNDE,'Nachname') LIKE cSuch
		ReadRec(KUNDE, nSaveRec);
	ELSE
		nRet := 1;
	END
	UnLock(KUNDE, 0);
	Return nRet
ENDPROC;


Beispiel 2: Lock 2



IF Lock(ARTIKEL,1,1)
	x:=FindRec(ARTIKEL,"12345","ARTIKEL.ID",1)
	ReadRec(ARTIKEL,x)
	SetRField(ARTIKEL,"Preis",GetRField(ARTIKEL,"Preis")*1.05)
	WriteRec(ARTIKEL,x)
	UnLock(ARTIKEL,1)
ELSE
	CGIWriteLn("Hinweis: ARTIKEL kann momentan nicht gesperrt werden")
END


Beispiel 3: Lock 3



WHILE NOT Lock(ARTIKEL,1,1)
	Pause(10)
END

..Hier ist die Tabelle gesperrt

x:=FindRec(ARTIKEL,"12345","ARTIKEL.ID",1)
ReadRec(ARTIKEL,x)
SetRField(ARTIKEL,"Preis",GetRField(ARTIKEL,"Preis")*1.05)
WriteRec(ARTIKEL,x)
Unlock(ARTIKEL)