[Gelöst] LOCKTABLE und RECORDREF

24. Februar 2009 11:37

Hallo zusammen,

folgende Frage:
Ich verwende in einer SQL-Datenbank eine RecordRef-Variable und hole mir über die GET-Funktion den Datensatz:
Code:
RE_RecRef.GET(<RecordID>);

Da ich im folgenden Code ggf. den Datensatz modifizieren muss, möchte ich ihn vorab schon einmal sperren.
Wie kann ich bei dem Datensatz sofort ein TableLocking durchführen? Folgenden Code kann ich nicht schreiben, da die Variable beim LOCKTABLE noch nicht initialisiert ist:
Code:
RE_RecRef.LOCKTABLE;
RE_RecRef.GET(<RecordID>);

Geht es vielleicht so? :
Code:
RE_RecRef.GET(<RecordID>);
RE_RecRef.LOCKTABLE;
RE_RecRef.GET(<RecordID>);

Ist der Datensatz nach dem 2. GET auch wirklich gesperrt?

Test ist leider nicht so einfach...
Zuletzt geändert von OlliK am 26. Februar 2009 14:02, insgesamt 1-mal geändert.

Re: LOCKTABLE und RECORDREF

24. Februar 2009 15:13

wieso brauchst Du ein zweites get? Hast du so viele Transaktionen pro sekunde, dass 2 zeilen code (GET, dann Locktable) ein unsicheres ergebnis bringen?

Re: LOCKTABLE und RECORDREF

24. Februar 2009 16:33

Nein, darum geht es nicht. Beim ersten GET wird die RecordRef-Variable 1. instanziert und 2. mit dem Datensatz aus der Tabelle, angegeben durch den RecordID-Parameter, gefüllt. Hier hätte ich eigentlich schon gern, dass der Datensatz gesperrt wird, geht aber nicht. Erst, wenn ich nach dem LOCKTABLE den Datensatz nochmals hole, wird er auch gleichzeitig mit gesperrt.
Nur ein nachfolgendes LOCKTABLE ohne folgendes GET sperrt den Datensatz leider nicht. Es scheint nur so zu funktionieren. Habe es probiert und so funktioniert es erst einmal. Ist nur sehr unschön, den Datensatz 2x holen zu müssen, um die Sperre aktivieren zu können.

Re: LOCKTABLE und RECORDREF

24. Februar 2009 16:41

Wenn du die Tabellennr. kennst, kannst du vor dem LOCKTABLE auch ein RecRef.OPEN(TableID); anstelle des (überflüssigen) RecRef.GET(RecID); absetzen.

Re: LOCKTABLE und RECORDREF

24. Februar 2009 16:46

Kenne ich leider nicht - ist ein Import/Export-Generator mit beliebigen Tabellen - deshalb verwende ich auch RecordID

Re: LOCKTABLE und RECORDREF

24. Februar 2009 22:29

Dann bleibt dir (zumindest beim ersten Zugriff) keine andere Möglichkeit, als den "überflüssigen" GET abzusetzen.
Wenn du die Datensätze in einer einzigen Transaktion abarbeitest (also keinen COMMIT dazwischen absetzt), dann reicht der LOCKTABLE ja ganz am Anfang der Schleife.
Beispiel:
Code:
IF ImportExportGenerator.FINDSET THEN BEGIN
  RE_RecRef.GET(ImportExportGenerator.RecordID);
  RE_RecRef.LOCKTABLE;
  REPEAT
    RE_RecRef.GET(ImportExportGenerator.RecordID);
    // Deine Verarbeitung
    RE_RecRef.MODIFY;
  UNTIL ImportExportGenerator.NEXT = 0;
END;


Sollte jedoch zwischendurch immer wieder ein COMMIT abgesetzt werden, so müsste tatsächlich jedesmal der zusätzliche GET vor dem LOCKTABLE abgesetzt werden.
Beispiel:
Code:
IF ImportExportGenerator.FINDSET THEN BEGIN
  REPEAT
    RE_RecRef.GET(ImportExportGenerator.RecordID);
    RE_RecRef.LOCKTABLE;
    RE_RecRef.GET(ImportExportGenerator.RecordID);
    // Deine Verarbeitung
    RE_RecRef.MODIFY;
    COMMIT;
  UNTIL ImportExportGenerator.NEXT = 0;
END;

[Gelöst] LOCKTABLE und RECORDREF

26. Februar 2009 14:01

Werde mal schauen, dass ich das mit Hilfe einer passenden Sortierung optimieren sprich minimieren kann.
Dank erst mal für den Tipp.