Inkonsistenter Datenbestand

21. August 2007 16:53

Hallo zusammen,
ich hatte vor kurzem bei einem Kunden ein seltsames Phänomen beobachten können.
Ich hatte einen Datensatz angelegt und ein anderer Usere konnte diesen nicht durch aktualisieren (Blättern usw.) sehen.
Hierzu mußte der Client geschlossen und neu gestartet werden.
Wie kann sowas passieren?
Wir haben jetzt mitlerweile des öfteren kleinere Inkonsistenzen, die wir bei einer lokalen DB nicht nachstellen können, da mußte ich heute wieder an diesen Effekt denken. Vielleicht hängt das ja zusammen.
Gearbeitet wird auf einem C-Side-Server mit einer 3,7 DB und einem 4,0 Client.

21. August 2007 18:24

Hier spielt euch der DBMS-Cache einen Streich:
Der neue Datensatz wird nicht unbedingt sofort physikalisch in die Datenbank zurückgeschrieben, sondern verbleibt erstmal noch (bis zu einem [expliziten/impliziten] COMMIT bzw. für max. 30 Sekunden) in deinem DBMS-Cache.
Wenn er dann endlich auf dem Server angekommen ist, dann heißt es noch lange nicht, dass ein anderer User ihn auch sofort zu gesicht bekommt, denn wenn er die Tabellendaten erst vor kurzem gelesen (also vom Server abgerufen) hat, so verweigert sich Navision die Daten nochmal komplett vom Server abzurufen, da der Datenbestand ja bereits im DBMS-Cache liegt.

Aus diesem Grund gibt es für Programmierer den Befehl SELECTLATESTVERSION, womit sichergestellt werden kann, dass der Client auf jeden Fall die Daten nochmal komplett vom Server abruft, egal, ob sie noch (recht aktuell) im DBMS-Cache liegen.
Als Anwender kann man da wirklich nur die Datenbank schließen und neu öffnen.

Da man als Programmierer dies häufiger machen muss (vor allem, wenn man an der Codeunit 1 programmiert), kenne ich die Tastatur-Sequenz schon auswendig:
[Alt], [d], [k], [s] (Datei -> Datenbank -> Schließen)
[Alt], [d], [1] (Datei -> Letzter geöffneter Mandant)
Mit ein bisschen Übung hat man diese Sequenz ganz schnell drauf
;-)

21. August 2007 18:29

Timo Lässer hat geschrieben:Aus diesem Grund gibt es für Programmierer den Befehl SELECTLATESTVERSION, womit sichergestellt werden kann, dass der Client auf jeden Fall die Daten nochmal komplett vom Server abruft

Und wo und wie rufe ich den Befehl typischerweise auf?

21. August 2007 18:42

Natalie hat geschrieben:Und wo und wie rufe ich den Befehl typischerweise auf?
Ich wollte dir gerade schreiben, dass du mal in der Form 6094 nachschauen sollst, aber stelle gerade fest, dass in 4.00 SP3 der Befehl aus dem Programmcode entfernt wurde.
Wenn du noch Zugriff auf eine ältere Version (z. B. 3.70) hast, dann findest du den Befehl in der genannten Form im Trigger OnTimer().

22. August 2007 09:06

Wir lesen mit einem C++ Programm, welches als Service eingerichtet ist, mittels C/FRONT Daten aus Navision aus. Hier muss auch unbedingt vor jedem Zugriff (das Programm laeuft ja quasi in einer Endlosschleife) dieser Befehl ausgefuehrt werden, da die ausgelesenen Daten sonst nicht aktuell sind.

Gruesse
feri

22. August 2007 09:46

Mittlerweile ist Arbeitsspeicher ja so günstig, dass der DBMS-Cache meist bis zum Maximum ausgereizt wird, daher trifft man dieses Phänomen immer öfter an.