AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Laufende Transaktion erkennen
Thema durchsuchen
Ansicht
Themen-Optionen

Laufende Transaktion erkennen

Ein Thema von DeddyH · begonnen am 5. Jul 2008 · letzter Beitrag vom 20. Jul 2008
Antwort Antwort
Seite 4 von 4   « Erste     234   
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#31

Re: Laufende Transaktion erkennen

  Alt 15. Jul 2008, 08:48
Logging ist aber was anders als Locking
Markus Kinzler
  Mit Zitat antworten Zitat
mquadrat

Registriert seit: 13. Feb 2004
1.113 Beiträge
 
Delphi XE2 Professional
 
#32

Re: Laufende Transaktion erkennen

  Alt 15. Jul 2008, 09:15
Wir benutzen für unser Programm nen eigenen TCP Server, der ne Liste mit allen gerade in Bearbeitung befindlichen Datensätzen hält. Die Locks in die Datenbank zu legen wäre natürlich auch eine Möglichkeit. Muss man halt drauf achten, dass die Transaktionen mit denen gelockt / der Lock überprüft werden nur so kurz wie möglich laufen.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#33

Re: Laufende Transaktion erkennen

  Alt 15. Jul 2008, 10:36
Hallo HeinzJ,

das hast du was falsch verstanden.
Es geht um das Sperren (Locken) von Datensätzen,
nicht Protokollieren (Loggen).


Heiko
Heiko
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#34

Re: Laufende Transaktion erkennen

  Alt 15. Jul 2008, 13:17
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...
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#35

Re: Laufende Transaktion erkennen

  Alt 15. Jul 2008, 13:46
Hallo Hansa,

im betreffenden Entwickler-Artikel wurd mit einer eigenen Lock-Table gearbeitet.
Dort steht Tabellenname/Id / DBId/ LockDatum/Zeit / Lock-User usw. drin.

Bevor das Programm einen Datensatz bearbeiten kann, muss es erst mal
die DBId in die LockTable packen (per unique index geht das nur einmal).

Das nette daran ist, dass man feststellen (und anzeigen) kann,
wer den Datensatz gerade sperrt.

Der Trick bestand ausserdem daran, das LockDatum per Timer immer wieder zu aktualisieren.


Heiko
Heiko
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#36

Re: Laufende Transaktion erkennen

  Alt 15. Jul 2008, 13:57
Keine Angst, habe den Artikel schon hier liegen. Aber nicht umgesetzt, weil zumindest Teile davon überholt sind. IMHO ist durch das neuere WITH LOCK das alles überflüssig. Oder eben auch nicht ? Das ist die Frage. Insbesondere, wie das mit dem Lagerbestand so geht, wie früher auch. Es kann doch fast nicht sein, dass mit einer noch aus DOS stammenden Datenbank mehr hinzukriegen ist, als mit FB Jahrgang 2008.
Gruß
Hansa
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#37

Re: Laufende Transaktion erkennen

  Alt 15. Jul 2008, 14:11
Hallo,

naja das With Lock musst du ja trotzdem machen,
aber doch erst, wenn wirklich geändert wird,
sonst blockierst du ja den Datensatz.

Table.Edit (Paradox) ist ja das gleiche wie

StartTransaction
Update Table Set Id=Id

// warten

Commit


Heiko
Heiko
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#38

Re: Laufende Transaktion erkennen

  Alt 15. Jul 2008, 14:35
Bei meinem Modell eben nicht. Die DS werden gelesen (natürlich mit dem richtigen Isolation-Level). Sagen wir zwei Stück. Die werden dann von 2 Usern editiert. Nur beim Abspeichern soll kurz der aktuelle Platten-DS gelockt und neu gelesen werden. Damit sollen keinerlei Änderungen für 2. Benutzer für diese kurze Zeit eben möglich sein. Bei Abweichungen aktueller DS auf Platte <-> dem fertig editierten und abzuspeichernden sollen die Differenzen ausgelesen und automatisch ausgeglichen werden. Dann war der eine eben schneller. Die Differenz wird programmtechnisch ausgeglichen und fertig.

Es ist kein Problem, immer den letzten den von ihm sichtbaren aktuellen Zustand herstellen zu lassen, der aber durch die vorherige Änderung falsch ist. Bei FIBPlus gibts ja im OI sogar zwei einzustellende Transaktionen (Transaction und UpdateTransAction) und das geht damit fast wie gewollt, aber nur fast. Die sagen, die eine läuft kurz und die andere lang usw. und das würde gehen. So einfach aber nicht. Wenn man zumindest den letzten schreibenden darauf hinweisen könnte, dass das nicht geht, weil der DS zwischenzeitlich bereits geändert wurde. Dann gehts aber wieder neu los. Wie die letzte Eingabe rückgängig machen und nur die ? Mit Savepoints könnte es vielleicht gehen. Ich sehe, muss mich nochmals intensiver mit Netzwerk auseinandersetzen.

schlägt roter Kasten plötzlich sogar zu früh zu ?
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#39

Re: Laufende Transaktion erkennen

  Alt 15. Jul 2008, 15:04
Und das Verhalten ist doch bei erneuten Lesen mit Lock möglich.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#40

Re: Laufende Transaktion erkennen

  Alt 20. Jul 2008, 15:20
Nach langem Herumprobieren scheint es mir tatsächlich die eleganteste Möglichkeit zu sein, eine eigene Locking-Tabelle einzuführen wie bereits weiter oben beschrieben. Ein Select mit der "WITH LOCK"-Option tut zwar wie erwartet, führt aber zu dem unschönen Nebeneffekt, dass der Start einer 2. Instanz so lange warten muss, bis die Sperre aufgehoben wurde, da ich im OnCreate die vorhandenen DS aufliste. Das Ganze ist auch hier beschrieben: http://www.firebirdfaq.org/faq182/.
Danke für die zahlreichen Antworten und Denkanstöße.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz