![]() |
Datenbank: FireBird • Version: 2.0.4 • Zugriff über: ZEOS 6.6.3 - stable
FireBird - Too many Savepoints?
Ich habe hier eine Anwendung, die sich beim Start mit einer embedded Firebird Datenbank Verbindet.
Beim Start der Anwendung wird ein Thread gestartet, der die Datenbank mit Daten füttert. Solange der Anwendet nichts macht führt der Thread eine INSERT Anweisung nach der anderen aus. Startet der Anwender eine Suche wo bei logischerweise eine Select Anweisung durchgeführt wird so erhalte ich eine Exception: "gds internal Software consistency check... (Too many Savepoints (287))" was soll das und wie verhindere ich diesen Fehler? Ich bin ratlos und finde nichts bzw. nicht viel zu dem Thema. |
Re: FireBird - Too many Savepoints?
Wann erzeugst du Savepoints ( Teiltransaktionen)?
|
Re: FireBird - Too many Savepoints?
Und die Savepoints werden tatsächlich nicht von dir erstellt ? Ganz sicher nicht ? Zeos düfte die wohl sowieso nicht unterstützen (glaube das kann nicht mal IBX), oder doch ?
|
Re: FireBird - Too many Savepoints?
Vor dieser Fehlermeldung habe ich nicht mals was von "Savepoints" gewußt,
ich arbeite nicht mit Transaktionen, das grobe Prinzip einer Transaktion verstehe ich ja aber ich hatte das nicht für nötig gehalten das zu benutzen. Also das hinzufügen von Datensätzen erfolgt vom Prinzip her so...
Delphi-Quellcode:
Das erledigt eine art "Update Thread" für mich im Hintergrund des Programms
SQLQuery := TZQuery.Create(self);
SQLQuery.SQL.Text := 'INSERT INTO TAB (Kunde, Name) VALUES (:Kunde, :Name)'; SQLQuery.ParamByName('Kunde').asString := sKunde; SQLQuery.ParamByName('Name').asString := sName; SQLQuery.ExecSQL; im Vordergrund kann der Anwender in den Daten suchen dazu wird eine 'SELECT' Abfrage erstellt und an die Datenbank geschickt, jedoch kommt dabei dann die besagte Fehlermeldung. Meine Vermutung ist das FireBird das nicht haben kann das man Datensätze hinzufügt und gleichzeitig eine Select-Abfrage startet. Da beim Programmstart die Datenbank ebenfalls befüllt wird, wenn diese leer ist lasse ich meine Anwendung zu Testzwecken laufen und bisher ohne Probleme er hat sicherlich schon so knapp 10.000 Datensätze hinzugefügt. Also an der Menge scheint es nicht zu liegen, das war meine erste Vermutung das ich nicht ohne ende hinzufügen kann ohne zwischen durch die DB zu "speichern". |
Re: FireBird - Too many Savepoints?
Zitat:
|
Re: FireBird - Too many Savepoints?
Zeos scheint wohl intern Savepoints zu verwenden. stelle auf explizite Transaktionssteuerung um
|
Re: FireBird - Too many Savepoints?
Ich hatte mal das selbe Problem.
Laufen deine INSERT-Statements in einem eigenen Thread ab? Also kann die Suchanfrage parallel dazu, natürlich nur über die selbe Connection, weil Embedded-Version, ausgeführt werden? Dann musst du mit kritischen Abschnitten arbeiten und den Datenbankzugriff auch innerhalb deines Programms schützen. |
Re: FireBird - Too many Savepoints?
Zitat:
starte prüfen soll ob der Thread gerade dabei ist INSERT anweisungen auszuführen. Oder ist damit irgendwas spezielles gemeint? Ansonsten kann ich ja auch wenn eine Suchanfrage gestartet wird das hinzufügen stoppen so das beim nächsten durchlauf weiter gemacht wird. Zitat:
|
Re: FireBird - Too many Savepoints?
Mit Hilfe von SavePoints kannst du Transaktionen in Teiltransaktionen zerlegen, welche du zurücksetzten kannst
|
Re: FireBird - Too many Savepoints?
Ich habe das ganze jetzt wie "omata" vorgeschlagen gelößt und verhindere programm intern das Datenbank "Update" und Suche
zeitgleich ablaufen können, indem ich das "Update" abbreche wenn ein Suchvorgang gestartet wird, so bekommt der Anwender nichts davon mit und die Fehlermeldung habe ich seit dem auch nicht wieder gesehen. Zur Zeit kämpfe ich dafür an Performance problemen, ich beführchte das FireBird nie so flott sein kann/wird wie z.b. ein Dedizierter MySQL Server aber das ist ein anderes Thema. |
Re: FireBird - Too many Savepoints?
Zitat:
Zeos ist halt nicht die erste Wahl. |
Re: FireBird - Too many Savepoints?
Ich habe z.b. eine Abfrage die mir die letzten N Datensätze ermitteln soll, bei mySQL sähe das wie folgt aus.
SQL-Code:
48721 ist das Ergebnis aus der Gesamt Anzahl der Datensätze minus der gewünschten 40 Datensätze
SELECT * FROM TAB ORDER BY Datum,DevNo ASC LIMIT 48721,40
dabei braucht diese Abfrage ca. 3-4 sekunden. Bei Firebird sieht die Abfrage wie folgt aus und benötigt dort ca. 12-13 sekunden.
SQL-Code:
SELECT FIRST 40 SKIP 48721 * FROM TAB ORDER BY Datum,DevNo ASC
Hmm was wäre den anstelle von Zeos deiner Meinung nach die erste Wahl?! |
Re: FireBird - Too many Savepoints?
Wie sieht es mit Indizes aus?
Schneller als Zeos ist IBDAC, FIBplus, IBObjects, ... |
Re: FireBird - Too many Savepoints?
Zitat:
|
Re: FireBird - Too many Savepoints?
Der Tabelle. Existiert ein Index auf die Felder Datum und DevNo?
|
Re: FireBird - Too many Savepoints?
Nein, das habe ich bisher nicht gemacht müßte ich mir anschauen wie ich diese Felder indiziert bekomme.
|
Re: FireBird - Too many Savepoints?
Zitat:
Wie sehen solche Vorgänge nun im Programm aus ? 1. Die Lieferung wird eingegeben. Sobald fertig, wird die Rückgabe eingegeben. Hierbei wurde der falsche Schein erwischt. Jetzt gibt es zwei Mölichkeiten : 1. Alles rückgängig machen, was bedeutet, auch die 100 Eingaben der neuen Bestellung neu machen zu müssen. Dabei ist auch vorausgesetzt, dass man bei jedem zusammenhängenden Vorgang zumindest eine Transaktion startet. Ansonsten kann auch die Arbeit eines ganzen Tages weg sein. 2. Man setzt nach der Eingabe der neuen Bestellung einen Savepoint. Wie gesagt, falschen Rücknahmeschein erwischt und das fällt erst nach Eingabe von 100 Rückgaben auf. 8) Dann mache ich eben ein RollBackToSavePoint und habe zumindest das neueingeben der Bestellung, die richtig war gespart. Im DB-Bereich hat schon alles einen gewissen Sinn, keine Angst. :mrgreen: Zitat:
|
Re: FireBird - Too many Savepoints?
Ich habe eine Anwendung die Messdaten Verwalten soll, d.h. Messungen werden von einer anderen Anwendung im Netzwerk
gespeichert, da jede Messung in einer sparaten Datei gespeichert wird, ist die suche nach einer oder mehren Messungen sehr Zeitaufwending. Den wenn ich z.b. über 80.000 Messungen (Dateien) vorliegen habe, muß ich jede Datei öffnen schauen ob sie den Suchkritierien entspricht und dann entsprechend in meiner Anwendung auflisten. Diesen vorgang wollte ich mir ersparen indem ich eine Datenbank einsetze in der die Messungen stehen, dort ließe sich ja viel schneller suchen. Da ich unabhängig und flexibel bleiben möchte dachte ich es macht am meisten Sinn eine Embedded Datenbank einzusetzen, weil auf dem Anwender Rechner nichts mehr installiert werden muß außer die eine Anwendung und keinen Datenbank Server etc. Warum man jetzt FireBird Embedded nicht für die Entwicklung nutzen sollte, verstehe ich nicht. Ich lerne in der Fahrschule ja auch mit einem Auto das Autofahren und nicht mit einem Roller. Das Prinzip von den Transaktionen habe ich denke ich einigermaßen Verstanden, ich kann diverse aktionen ausführen und erst wenn klar ist das alles in ordnung ist kann ich dann die aktionen bestätigen "Commit" oder ein "Rollback" durchführen um die Änderungen rückgängig zumachen. Also müßte ich vor einem Insert einen "Savepoint" setzen dann das Insert ausführen und dann muß ich das jetzt noch mit einem "Commit" bestätigen!? Wieso reicht es da nicht aus eine einfache "Insert" Anweisung auszuführen. In der Anwendung gibt es eh nur eine Tabelle in einer Datenbank, es ist ja nicht so das ich in Tabelle X etwas einfüge und wenn in Tabelle Y etwas schief geht das ich den Eintrag aus X wieder rückgängig machen will, das verstehe ich unter Transaktionen. Mein Problem ist halt ich muß ja irgendwie Anfangen das Problem umzusetzen und wenn man im Internet stöbert findet man hunderte von Datenbank Systemen und hunderte Möglichkeiten auf diese zuzugreifen, wie soll man als Laie sofort und ohne Studium aller Dokumentationen herrausfinden was man benötigt also greift man auf das zu was man kennt oder wovon man schon gehört hat und probiert damit aus das vorhandne Problem zu lösen. |
Re: FireBird - Too many Savepoints?
Zitat:
Zitat:
|
Re: FireBird - Too many Savepoints?
Sieht so aus, als hätteste Transaktionen immer noch nicht ganz gerafft.
Zitat:
Und die Fahrschule ist wirklich hervorragendes Beispiel. Du lernst Autofahren mit einem embedded Einrad. :mrgreen: |
Re: FireBird - Too many Savepoints?
Naja das Argument das man dann mit Anwendung und Admin Tool gleichzeitig drauf zugreifen kann,
das verstehe ich und macht auch Sinn, ich habe nur die Embedded Variante gewählt damit ich direkt sehen kann wie das Funktioniert, ich habe zuvor nie mit FireBird gearbeitet. Daher dachte ich mir erschlage ich gleich 2 Probleme, die Anbindung an FireBird und das Handling mit einer Embedded Datenbank. Zitat:
in meiner Update Routine aber das bekomme ich noch hin. Schlimmer ist da eher das Performance problem, aber auch da muß ich mir noch Gedanken zu machen. Ob ich da mit Indizes "mehr power" aus dem Teil herrausbekomme. mkinzler meinte ja auch schon Zeos wäre nicht so das performanteste auf dem Markt, ich hatte mal ursprünglich die dbExpress Komponenten vom Delphi 2007 benutzt zumindest für mySQL ich weiß nur nicht mehr wieso ich davon weggegangen bin. Ich glaub ich muß mir die Komponenten noch mal ansehen, spätestens mit Delphi 2009. |
Re: FireBird - Too many Savepoints?
Moin, moin,
Wenn man bei Zeos nach dem ExceSQL Query.Active := false und dann gleich wieder auf true setzt sollte das Problem nicht mehr auftreten. Grüße // Martin |
Re: FireBird - Too many Savepoints?
Zeos bildet das Verhalten der BDE nach. Ein harter Commit wird nun gemacht, wenn eine Verbindung geschlossebn wird. Sonst werden die Tranaktionen nur softcommittet, was wohl bedeutet das SavePoints erzeugt werden.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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