Zitat von
hoika:
Hallo IBExpert,
basierend auf dem Entwickler-Artikel (6/2003) ?
welche Zugriffskomponente ?
Der Artikel basiert aber auf
FB 1.5, wenn nicht sogar 1.0. WITH LOCK gabs damals nicht und es hieß/heißt immer zumindest "Locking braucht man nicht für
IB /
FB". Ich sehe das allerdings nicht so. Früher habe ich das immer so gemacht : User1 editiert Datensatz. Jetzt fängt User2 an, genau denselben Datensatz auch zu editieren. DeddyH's Frage läuft wohl auch auf diese Konstellationen hinaus. Ich bin deshalb hingegangen und habe den DS vor dem Speichern erst mal gesperrt, dann neu gelesen. Kennt einer noch die BTree-Isam/Shell von Ralf Nagel/Enz (jetzt umgebaut als Flashfiler) ? Man hatte da drei Puffer für Datensätze : Workbuffer, Savebuffer und noch einen Dritten.
Der Workbuffer war hierbei der gerade editierte Datensatz. Hat der sich von dem auf der Platte unterschieden (war deshalb eben sicherheitshalber gelockt und neu gelesen worden), dann konnte man die Felder einzeln auslesen und bearbeiten. Felder gezielt aktualisieren und fertig.
Beim Lagerbestand bin ich z.B. hingegangen und habe die durch gleichzeitigen Zugriff eventuell entstehenden Differenzen im Programm ermittelt und dann eben automatisch ausgeglichen und abgespeichert, dann Lock entfernt. Bsp.: Menge 10, User1 bucht Menge 1 ab, von der User2 (noch) nichts weiß, der hat immer noch auf seinem Bildschirm 10 stehen, sind aber bereits nur 9. Jetzt bucht User2 Menge 2 ab. Ergibt aus Sicht von User2 8. In Wirklichkeit sind es aber nur noch 7. Wenn der jetzt speichert, dann ist der Bestand um 1 höher, als er tatsächlich ist. Es ist zwar ein seltener konstruierter Fall, aber so etwas kann vorkommen. Mit geschickter Nutzung der Transaction-Isolation-Levels ist es mir zwar gelungen, das wasserdicht zu machen, aber so wie beim beschriebenen Lagerbestands-Problem habe ich es nicht hingekriegt. Es ist noch nicht komfortabel genug, so wie vorher gewöhnt.
Jetzt ist die Frage : was habe ich übersehen, bzw. nicht verstanden oder geht das Verhalten wie beschrieben nur mit Locking, wie vorher auch ?
Das mit dem Workbuffer, Savebuffer usw. wird doch zumindest intern in
IB/
FB mit dem BDR (Back Difference Record) realisiert. Nur, ich kenne keinen, der da vom Programm her dran kommt und das Ding auswerten kann.
Zitat von
IBExpert:
ich mach meistens mein eigenes locking, also im prinzip wie hier besprochen...
Und wie genau ? Hier wurde viel Durcheinander besprochen. Logging, Locktable...