![]() |
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. |
Re: Laufende Transaktion erkennen
Öffne ihn explizit mit Lock
|
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?
|
Re: Laufende Transaktion erkennen
|
Re: Laufende Transaktion erkennen
Danke, dann arbeite ich mich mal durch.
|
Re: Laufende Transaktion erkennen
Nachdem ich nun einige Seiten und ein Buch zu diesem Thema durchgeackert habe (u.a.
![]() |
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
|
Re: Laufende Transaktion erkennen
Welche (möglichst Freeware oder zumindest bezahlbaren) kannst Du empfehlen?
|
Re: Laufende Transaktion erkennen
IBDac von DevArt ( ohne Source 99€) sind echt gut. Hansa würde zu FIBplus raten.
|
Re: Laufende Transaktion erkennen
Das übersteigt zwar im Moment mein Bidet (:mrgreen:), aber Danke, ich werde mir das mal ansehen.
|
Re: Laufende Transaktion erkennen
IBX sollte grundsätzlich auch reichen oder dbExpress, AnyDAC
|
Re: Laufende Transaktion erkennen
Zitat:
|
Re: Laufende Transaktion erkennen
Das ist trotzdem ne Menge Holz für jemanden, der nicht beruflich programmiert.
|
Re: Laufende Transaktion erkennen
Zitat:
[Edit] Flashfiler heisst das Teil [/edit] |
Re: Laufende Transaktion erkennen
FlashFiler steht auf Sourceforge AFAIK, hab ich mir aber noch nie angesehen. Kann ja nicht schaden ;) Thx, Kaki :cheers:
|
Re: Laufende Transaktion erkennen
Kommt aber nicht an FireBird ran.
|
Re: Laufende Transaktion erkennen
Zitat:
|
Re: Laufende Transaktion erkennen
Zitat:
|
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.
![]() |
Re: Laufende Transaktion erkennen
Zitat:
|
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.
|
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.
|
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 ;( |
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. |
Re: Laufende Transaktion erkennen
Hab da noch etwas Anderes entdeckt:
![]() |
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 |
Re: Laufende Transaktion erkennen
Hallo IBExpert,
basierend auf dem Entwickler-Artikel (6/2003) ? welche Zugriffskomponente ? Heiko |
Re: Laufende Transaktion erkennen
Da er in FIBplus arbeitet wohl auf deren Basis. Hoffentlich aber unabhängig
|
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 ![]() |
Re: Laufende Transaktion erkennen
so als idee. vielleicht tuts als Alternative ja auch das Logging (log4d oder diverse properitäre).
|
Re: Laufende Transaktion erkennen
Logging ist aber was anders als Locking
|
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.
|
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 |
Re: Laufende Transaktion erkennen
Zitat:
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:
|
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 |
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:
|
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 |
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: |
Re: Laufende Transaktion erkennen
Und das Verhalten ist doch bei erneuten Lesen mit Lock möglich.
|
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:
![]() 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