[Gelöst] Fehler bei Verändern (Löschen) von Datensätzen

1. Juli 2008 11:35

Hi allerseits,

habe ein eigenartiges Problem:
wir setzen Navi 3.7 mit der nativen Datenbank ein. Zur Synchronisation mit einem Webshop existiert eine Massage-Datei. In diese Datei werden bei aktualisierung von Datensätzen Protokollsätze geschrieben. In einem Nas läuft nun ein Programm, das diese Protokollsätze liest, per Msmq weiterleitet und anschliessend löscht. Das klappt grundsätzlich gut. Wenn nun aber in einem kurzen Zeitraum sehr viele Datensätze in diese Datei geschrieben werden, dann gibt es beim NAS die Fehlermeldung:

Code:
"ein anderer Anwender hat den Datensatz xxx geändert, nachdem Sie ihn gelesen haben....


Ich habe nun versucht, dieses Verhalten nachzubilden. Dazu habe ich mir eine Table angelegt, die nur einen Key (Integer) hat. In diese Datei schreibe ich fortlaufend Sätze hinein:

Code:
Fenster.OPEN(' #1########');
FOR I := 1 TO 5000000 DO BEGIN
  Fenster.UPDATE(1,I);
  CLEAR(TestRec);
  TestRec.Key := I;
  TestRec.INSERT(FALSE);
  COMMIT();
END;


Auf einem anderen Client starte ich nun ein Codeunit, das nichts anderes tut, als die Sätze zu lesen und zu löschen:

Fenster.OPEN('#1#########');
IF TestRec.FIND('-') THEN REPEAT
TestRec.DELETE(false);
I := I +1;
I1 := I1+1;
IF I1=100 THEN BEGIN
Fenster.UPDATE(1,I);
I1:=0;
COMMIT();
END;
UNTIL (TestRec.NEXT = 0);
MESSAGE('ende!');


Es erscheint prompt wieder die entsprechende Fehlermeldung, obwohl mit Sicherheit kein Datensatz geändert wurde.
Wenn ich hinter den DELETE ein COMMIT einfüge, dann tritt der Fehler nicht mehr auf, dass zieht aber im Realbetrieb den Datenbankserver runter und wäre die schlechteste Lösung.

Ist das eine Unzulänglichkeit von Navi oder von mir? (zweiteres wäre mir lieber, dann könnt ich das nämlich ändern.
Zuletzt geändert von elf am 2. Juli 2008 09:31, insgesamt 1-mal geändert.

2. Juli 2008 09:31

ok, habe ein Workaround gefunden:

Vor dem "IF TestRec.FIND('-') setze ich ein TestRec.LOCKTABLE, damit ist die Tabelle gesperrt und es kann kein anderer Anwender Sätze 'reinschreiben. Das sperrt zwar die Table für kurze Zeit, liegt aber in einer vertretbaren Größenordnung.