27. September 2010 12:46
WITH Cust DO BEGIN
RESET;
IF FINDSET THEN BEGIN
REPEAT
... tu was
// Save rec if changed
IF ChangesMade THEN
MODIFY;
UNTIL NEXT = 0;
END;
END;
COMMIT;
27. September 2010 15:27
27. September 2010 15:38
HattrickHorst hat geschrieben:Wenn du kein explizites LOCKTABLE verwendest, dann wird eine Tabelle bspw. direkt vor einem INSERT oder MODIFY gesperrt.
27. September 2010 15:50
27. September 2010 16:03
HattrickHorst hat geschrieben:Direkt danach. Bei Stapeldurchläufen kann es aber sein, daß ein Durchlauf so schnell ausgeführt wird, daß keine andere Aktion dazwischengelassen wird.
27. September 2010 16:21
HattrickHorst hat geschrieben:Direkt danach. Bei Stapeldurchläufen kann es aber sein, daß ein Durchlauf so schnell ausgeführt wird, daß keine andere Aktion dazwischengelassen wird.
27. September 2010 16:35
27. September 2010 16:59
27. September 2010 18:12
27. September 2010 20:40
27. September 2010 20:51
Hattrickhorst hat geschrieben:Das Sperren einer Tabelle bzw. eine Datensatzes findet aber, wenn man es nicht explizit aufruft, nur als Klammer um die Befehle INSERT, MODIFY (auch RENAME) und DELETE inkl. der analogen Massenbefehle statt.
27. September 2010 21:29
fiddi hat geschrieben:Der Insert... Startet den Lock. Dieser Lock muss aber bestehen bleiben, bis der letzte schreibende Befehl einer Transaktion abgeschlossen ist, sonst kann man kein Rollback einer Transaktion durchführen.
IF Rec.FINDSET THEN REPEAT
IF Rec.FIELD = Wert THEN
Rec.MODIFY;
UNTIL Rec.NEXT = 0;
27. September 2010 22:09
27. September 2010 23:27
27. September 2010 23:43
28. September 2010 09:52
28. September 2010 10:33
NAV2009 Hilfe hat geschrieben:When data is read without locking, you get the latest (possibly uncommitted) data from the database. If you call Rec.LOCKTABLE, nothing happens. However, when data is read from the table after LOCKTABLE has been called, the data is locked.
28. September 2010 10:37
fiddi hat geschrieben:Jetzt muss Ralf nur noch mal erklären, was er verstanden hat
Ich hoffe, es ist klar geworden, das ein Lock untrennbar mit einer Transaktion verbunden ist, und das ein einmal gesetzter Lock erst bei einem Commit oder Error wieder aufgehoben wird.
Gruß, Fiddi
28. September 2010 10:56
ralf5 hat geschrieben:Mir ist es nun klar geworden.
Deshalb mache ich jetzt auch nach dem Modify ein Commit und meine sorgen bin ich los.
28. September 2010 11:32
fiddi hat geschrieben:Welcher Datensatz aktuell ist, findet der Server anhand der letzten committeten Transaktionsid heraus. Ist die ID des aktuellen Datensatzes niedriger als die des ältesten uncommitteten, dann ist der Datensatz gültig, ansonsten ändert gerade jemand diesen Datensatz.
MSDN hat geschrieben:The purpose of locking with LOCKTABLE(TRUE,TRUE) after reading the records for the first time is to improve concurrency by postponing the table lock that Classic Database Server puts on the table.
28. September 2010 11:59
fiddi hat geschrieben:Nun ja
Du soltest noch folgendes beachten:
- Jedes Commit kostet nicht unerheblich viel Zeit. Deshalb bei großen Datenmengen sparsam damit umgehen
- Ein Commit sollte nur dann von Hand ins System eingebracht werden, wenn es eine abgeschlossene Gruppe von Befehlen beendet, und der normale implizite Commit nicht ausreicht weil nachfolgender Code die geänderten Daten benötigt. Ein Proforma- Commit kann sehr viel Unheil in der DB anrichten, weil die Daten nicht mehr konsistent sind. Das gilt besonders für Code der aus unterschiedlichen Modulen aufgerufen wird.
Gruß, Fiddi