Topic complex |
Table functions |
Function |
lock() |
Short |
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 |
Return |
1 : Sperre ist eingerichtet
0 : Sperre ist nicht eingerichtet |
See also: |
|
Description |
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.
|
Example 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;
|
Example 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
|
Example 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)
|
Write a comment:
|