TurboPL Referenz

Lock Prozedur

Top  Previous  Next

Syntax

Lock(Tabelle, ForWrite, DontWait: Integer): Integer

Kategorie

Datenbank-Befehl

Erklärung

Hier handelt es sich um eine Netzwerkfunktion, die in der Einplatzversion immer den Wert 1 liefert.Die Funktion Lock dient dem Setzen der elementaren Schreib- beziehungsweise Totalsperre. Lock sollte immer dann benutzt werden, wenn Zugriffe auf Datenbanktabellen über mehrere einzelne Funktionen 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 Funktionen abzuarbeiten und die Sperre mit Unlock wieder aufzuheben. Dies bringt im Netz nicht nur eine erhöhte Sicherheit, sondern auch eine gesteigerte Performanz.

Für die Art der Sperre (Parameter ForWrite) gilt:
0 : Schreibsperre
1 : Totalsperre

Für den Parameter DontWait gilt:
0 : Sperre wird unbedingt eingerichtet; Programm wartet
1 : Sperre wird eingerichtet, wenn möglich; Programm wartet nicht

Rückgabewert:
1 : Sperre ist eingerichtet
0 : Sperre ist nicht eingerichtet

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

Beispiel

Das folgende Beispiel zeigt bereits den Sinn von Lock.  Alle in diesem Beispiel verwendeten Tabellenzugriffe setzen ihrerseits jeweils vor Abarbeitung die nötigen Sperren und heben diese sofort wieder auf, wenn die Funktion abgearbeitet wurde. Wird allerdings mit Lock eine Sperre zu Anfang auf die Datei gelegt, so setzen die einzelnen Funktionen ihrerseits keine Sperren mehr. Die Performanz kann so deutlich verbessert werden.  Zudem kommt speziell in diesem Beispiel noch die Tatsache hinzu, dass unter Umständen ein gesicherter Datensatz wieder gelesen werden muss. Im ungünstigsten Fall wird zwischen dem Sichern der Satznummer in nSaveRec und dem Zurücksetzen des Satzzeigers mit ReadRec(KUNDE.DAT, nSaveRec) der Datensatz von einer anderen Station entfernt.

Somit wäre ein sicheres Lesen des alten Datensatzes gefährdet. Daher sollten solche Vorgänge in einer netzwerkfähigen Entwicklung immer von Lock und Unlock umgeben sein.

PROCEDURE FindName(cSuch: String): Integer;
VARDEF nSaveRec, nret : Integer;
               Lock(KUNDE.DAT, 0);
               nSaveRec := RecNo(KUNDE.DAT);
               ReadRec(KUNDE.DAT, FINDREC(KUNDE.DAT, cSuch));
               IF NOT $KUNDE.Nachname LIKE cSuch
                               ReadRec(KUNDE.DAT, nSaveRec);
               ELSE
                               nRet := 1;
               END
               UnLock(KUNDE.DAT, 0);
               Return nRet
ENDPROC;

Siehe auch

EditOff, EditOn, Rollback, TransOff, TransOnUnLock