Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Laufende Transaktion erkennen (https://www.delphipraxis.net/116739-laufende-transaktion-erkennen.html)

DeddyH 5. Jul 2008 12:45

Datenbank: Firebird • Version: 2.0 • Zugriff über: ZEOS

Laufende Transaktion erkennen
 
Ist es irgendwie möglich, unter Firebird zu erkennen, ob der aktuelle Datensatz gerade von einem anderen Benutzer editiert wird? Ich würde in diesem Falle gerne eine Meldung ausgeben, habe aber nicht herausfinden können, wie ich das mitbekommen könnte.

Schonmal Danke im Voraus.

mkinzler 5. Jul 2008 13:08

Re: Laufende Transaktion erkennen
 
Öffne ihn explizit mit Lock

DeddyH 5. Jul 2008 13:11

Re: Laufende Transaktion erkennen
 
Ein ähnlicher Gedanke war mir auch schon gekommen, aber wie bekomme ich bereits beim Anzeigen des Satzes mit, dass er gerade locked ist?

mkinzler 5. Jul 2008 13:17

Re: Laufende Transaktion erkennen
 
http://ibdeveloper.com/issues/issue-...he-lock-table/

DeddyH 5. Jul 2008 13:24

Re: Laufende Transaktion erkennen
 
Danke, dann arbeite ich mich mal durch.

DeddyH 10. Jul 2008 17:25

Re: Laufende Transaktion erkennen
 
Nachdem ich nun einige Seiten und ein Buch zu diesem Thema durchgeackert habe (u.a. hier), stellt sich mir die Frage, ob es nicht das Einfachste wäre, die ZConnection auf Transaktionslevel tiRepeatableRead zu stellen. Oder hab ich da was falsch verstanden? Sry, ist das erste Mal, dass ich mir um so etwas Gedanken machen muss, hab sonst eher mit FB Embedded gearbeitet, da stellen sich solche Fragen erst gar nicht.

mkinzler 10. Jul 2008 17:28

Re: Laufende Transaktion erkennen
 
Ich würde mich mal nach anderen Komponenten umsehen. da die Zeos eher das Verhalten der BDE nachbildet und keine richtige Transaktionssteuerung unterstützt

DeddyH 10. Jul 2008 17:32

Re: Laufende Transaktion erkennen
 
Welche (möglichst Freeware oder zumindest bezahlbaren) kannst Du empfehlen?

mkinzler 10. Jul 2008 17:36

Re: Laufende Transaktion erkennen
 
IBDac von DevArt ( ohne Source 99€) sind echt gut. Hansa würde zu FIBplus raten.

DeddyH 10. Jul 2008 17:38

Re: Laufende Transaktion erkennen
 
Das übersteigt zwar im Moment mein Bidet (:mrgreen:), aber Danke, ich werde mir das mal ansehen.

mkinzler 10. Jul 2008 17:40

Re: Laufende Transaktion erkennen
 
IBX sollte grundsätzlich auch reichen oder dbExpress, AnyDAC

Hansa 10. Jul 2008 17:52

Re: Laufende Transaktion erkennen
 
Zitat:

Zitat von mkinzler
Hansa würde zu FIBplus raten.

Woher Du wissen ? :-D Aber ich sage dasselbe wie immer : umsonst ist nur der Tod und der kostet das Leben. :mrgreen: FIB kostet allerdings mehr, als irgendeine kostenlose Allerwelts-Komponente wie Zeos. Ca. 200-250 inkl. Source. Ist halt optimiert für IB/FB.

DeddyH 10. Jul 2008 18:07

Re: Laufende Transaktion erkennen
 
Das ist trotzdem ne Menge Holz für jemanden, der nicht beruflich programmiert.

Der.Kaktus 10. Jul 2008 18:32

Re: Laufende Transaktion erkennen
 
Zitat:

Zitat von DeddyH
Das ist trotzdem ne Menge Holz für jemanden, der nicht beruflich programmiert.

Ich bevorzuge als Datenbank immer noch Die DBISAM Variante..damals von Turbo-Power(nun Open Source)..da bekommst Du das leicht raus ob ein Satz gelockt ist oder nicht und kostet nix ;-) Adresse musste mal schauen..faellt mir gerade nicht ein.
[Edit] Flashfiler heisst das Teil [/edit]

DeddyH 10. Jul 2008 18:39

Re: Laufende Transaktion erkennen
 
FlashFiler steht auf Sourceforge AFAIK, hab ich mir aber noch nie angesehen. Kann ja nicht schaden ;) Thx, Kaki :cheers:

mkinzler 10. Jul 2008 18:40

Re: Laufende Transaktion erkennen
 
Kommt aber nicht an FireBird ran.

Der.Kaktus 10. Jul 2008 18:42

Re: Laufende Transaktion erkennen
 
Zitat:

Zitat von DeddyH
FlashFiler steht auf Sourceforge AFAIK, hab ich mir aber noch nie angesehen. Kann ja nicht schaden ;) Thx, Kaki :cheers:

Kann ich nur empfehlen..macht keine Probs und habe fast alle groesseren!! Sachen damit gemacht..kleinere mach ich eh mit kbmmemtable ;-) :cheers:

Der.Kaktus 10. Jul 2008 18:43

Re: Laufende Transaktion erkennen
 
Zitat:

Zitat von mkinzler
Kommt aber nicht an FireBird ran.

Geschwindigkeitsmaessig sicher ;-)

mkinzler 10. Jul 2008 18:46

Re: Laufende Transaktion erkennen
 
Nein, es gab mal einen Test in der Toolbox, zwischen verschiedenen embedded DB-Systemen. Bei einfachen Abfragen war SqlLite das schnellste. Umso komplexer die Aufgaben wurden, desto mehr hat FB den Vorsprung ausgebaut. FlashFiler war mit Abstand das langsamste.

http://www.toolbox-mag.de/data/tx32006artikel1.pdf

Der.Kaktus 10. Jul 2008 18:47

Re: Laufende Transaktion erkennen
 
Zitat:

Zitat von mkinzler
Nein, es gab mal einen Test in der Toolbox, zwischen verschiedenen embedded DB-Systemen. Bei einfachen Abfragen war SqlLite das schnellste. Umso komplexer die Aufgaben wurden, desto mehr hat FB den Vorsprung ausgebaut. FlashFiler war mit Abstand das langsamste.

Oha :shock:

DeddyH 10. Jul 2008 18:49

Re: Laufende Transaktion erkennen
 
Anyway, ich hab es mir mal gezogen :zwinker: . Ob da jetzt noch eine DB mehr bei mir läuft, spielt auch keine Rolle mehr.

Hansa 10. Jul 2008 19:03

Re: Laufende Transaktion erkennen
 
Das Gute an FlashFiler war folgendes : egal, ob Mehrplatz oder Einzelplatz-Programm, das war einfach gleichzeitig zu bewerkstelligen. Dazu war allenfalls eine Compiler-Direktive und eine Funktion nötig. Nur leider : das war einmal. :zwinker: Die Aktivität bei Sourceforge ist zu gering, um damit ernsthaft anzufangen. Ich kenne den Dipl.-Math., der das entwickelt hat. Leider ging es dann doch an TurboPower.

hoika 10. Jul 2008 19:10

Re: Laufende Transaktion erkennen
 
Hallo,

eine Alternative ist das Locken selber zu machen
-> LockTable(Id,TableId/TableName,PrimKey,LockDate/LockTime)

Ist etwas aufwändiger, klappt aber mit jeder DB,
die halbwegs Transaktionen und unique indices unterstützt.
Das Prüfen, ob Lock existiert erfolgt durch ReadCommitted Transactions.

Der Trick ist das LockDate/LockTime
das wird vom lockende Programm ständig aktualisiert, um "tote" Locks
(Programm ist abgstürzt) zu finden.


Heiko

PS: Das muss ich auch noch machen ;(

DeddyH 10. Jul 2008 19:12

Re: Laufende Transaktion erkennen
 
Klingt interessant (und für mich als armen Sack schon wieder hoffnungsvoller).

P.S.: Flashfiler stammt in der aktuellen Version aus 2003, mit Support dürfte es aso eher mau aussehen.

DeddyH 11. Jul 2008 17:03

Re: Laufende Transaktion erkennen
 
Hab da noch etwas Anderes entdeckt: FBLib. Sieht auf den ersten Blick gar nicht schlecht aus und kost nix :mrgreen:

IBExpert 14. Jul 2008 22:08

Re: Laufende Transaktion erkennen
 
ich mach meistens mein eigenes locking, also im prinzip wie hier besprochen. vereinfacht unheimlich viel wenn man selbst im code entscheidet wann und wie lange was gelockt ist (gesperrt klingt irgendwie besser, sind ja keine Locken drin). Man kann auch besser selbst entscheiden wann man locks prüft und wie man drauf reagiert, oder zum Beispiel locks älter als 60 minuten ignoriert und löscht oder was auch immer in den eigenen Prozess mit einbindet.

ich bastel gerade an einem Projekt was im Prinzip auf den ganzen Ideen basiert, die ich schon seit Jahren predige ;-)
Kann zwar noch dauern bis das fertig ist aber im Moment ist mein Plan das als Open Source Projekt zu veröffentlichen
schaun mer mal

hoika 15. Jul 2008 06:33

Re: Laufende Transaktion erkennen
 
Hallo IBExpert,

basierend auf dem Entwickler-Artikel (6/2003) ?
welche Zugriffskomponente ?


Heiko

mkinzler 15. Jul 2008 06:42

Re: Laufende Transaktion erkennen
 
Da er in FIBplus arbeitet wohl auf deren Basis. Hoffentlich aber unabhängig

Lemmy 15. Jul 2008 06:47

Re: Laufende Transaktion erkennen
 
Hi,

UIB in dem ganzen Reigen nicht vergessen - auch kostenlos. Aber bitte nicht die Jedi-Version verwenden, die ist alt, sondern die aktuelle Version http://www.progdigy.com/?page_id=5

HeinzJ 15. Jul 2008 07:45

Re: Laufende Transaktion erkennen
 
so als idee. vielleicht tuts als Alternative ja auch das Logging (log4d oder diverse properitäre).

mkinzler 15. Jul 2008 07:48

Re: Laufende Transaktion erkennen
 
Logging ist aber was anders als Locking

mquadrat 15. Jul 2008 08:15

Re: Laufende Transaktion erkennen
 
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.

hoika 15. Jul 2008 09:36

Re: Laufende Transaktion erkennen
 
Hallo HeinzJ,

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


Heiko

Hansa 15. Jul 2008 12:17

Re: Laufende Transaktion erkennen
 
Zitat:

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. :gruebel: 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 ? :shock: 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:

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... :mrgreen:

hoika 15. Jul 2008 12:46

Re: Laufende Transaktion erkennen
 
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

Hansa 15. Jul 2008 12:57

Re: Laufende Transaktion erkennen
 
Keine Angst, habe den Artikel schon hier liegen. :-D Aber nicht umgesetzt, weil zumindest Teile davon überholt sind. IMHO ist durch das neuere WITH LOCK das alles überflüssig. Oder eben auch nicht ? :mrgreen: 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. :shock:

hoika 15. Jul 2008 13:11

Re: Laufende Transaktion erkennen
 
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

Hansa 15. Jul 2008 13:35

Re: Laufende Transaktion erkennen
 
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 ? :shock:

mkinzler 15. Jul 2008 14:04

Re: Laufende Transaktion erkennen
 
Und das Verhalten ist doch bei erneuten Lesen mit Lock möglich.

DeddyH 20. Jul 2008 14:20

Re: Laufende Transaktion erkennen
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz