Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FireBird - Too many Savepoints? (https://www.delphipraxis.net/119431-firebird-too-many-savepoints.html)

TUX_der_Pinguin 26. Aug 2008 14:33

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.

mkinzler 26. Aug 2008 14:42

Re: FireBird - Too many Savepoints?
 
Wann erzeugst du Savepoints ( Teiltransaktionen)?

Hansa 26. Aug 2008 14:42

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 ?

TUX_der_Pinguin 26. Aug 2008 14:55

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:
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;
Das erledigt eine art "Update Thread" für mich im Hintergrund des Programms
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".

Hansa 26. Aug 2008 15:18

Re: FireBird - Too many Savepoints?
 
Zitat:

Zitat von TUX_der_Pinguin
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...

Ersteres war zu erwarten. Und mit dem Verzicht auf Transaktionen hebelst du die ganze DB aus. FB ohne Transaktionen ? :shock: Dass dann irreführende Fehlermeldungen kommen, ist kein Wunder. Ein Select auf die gerade eingefügten Datensätze kann gar nicht gehen, bevor die betreffende Transaktion committed ist. Bzw. wird da nichts zurückkommen, weil das noch "inoffiziell" ist. Dass da jetzt irgendwas mit Savepoints angemahnt wird, das dürfte Zeos Schuld sein. :mrgreen:

mkinzler 26. Aug 2008 15:24

Re: FireBird - Too many Savepoints?
 
Zeos scheint wohl intern Savepoints zu verwenden. stelle auf explizite Transaktionssteuerung um

omata 26. Aug 2008 15:35

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.

TUX_der_Pinguin 27. Aug 2008 07:26

Re: FireBird - Too many Savepoints?
 
Zitat:

Zitat von omata
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.

Ja genau das Problem habe ich, was heißt den jetzt "kritische Abschnitte" ? Soll das heißen das ich bevor ich eine Suchanfrage
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:

Zitat von mkinzler
Zeos scheint wohl intern Savepoints zu verwenden. stelle auf explizite Transaktionssteuerung um

Was sind den diese Savepoints überhaupt und wozu sind diese gut, ich raff das noch nicht so ganz.

mkinzler 27. Aug 2008 08:19

Re: FireBird - Too many Savepoints?
 
Mit Hilfe von SavePoints kannst du Transaktionen in Teiltransaktionen zerlegen, welche du zurücksetzten kannst

TUX_der_Pinguin 27. Aug 2008 08:37

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.

mkinzler 27. Aug 2008 08:39

Re: FireBird - Too many Savepoints?
 
Zitat:

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.
Und warum nicht?
Zeos ist halt nicht die erste Wahl.

TUX_der_Pinguin 27. Aug 2008 08:52

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:
SELECT * FROM TAB ORDER BY Datum,DevNo ASC LIMIT 48721,40
48721 ist das Ergebnis aus der Gesamt Anzahl der Datensätze minus der gewünschten 40 Datensätze
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?!

mkinzler 27. Aug 2008 09:02

Re: FireBird - Too many Savepoints?
 
Wie sieht es mit Indizes aus?
Schneller als Zeos ist IBDAC, FIBplus, IBObjects, ...

TUX_der_Pinguin 27. Aug 2008 09:04

Re: FireBird - Too many Savepoints?
 
Zitat:

Zitat von mkinzler
Wie sieht es mit Indizes aus?
Schneller als Zeos ist IBDAC, FIBplus, IBObjects, ...

Was für Indizes meinst du?

mkinzler 27. Aug 2008 09:06

Re: FireBird - Too many Savepoints?
 
Der Tabelle. Existiert ein Index auf die Felder Datum und DevNo?

TUX_der_Pinguin 27. Aug 2008 09:07

Re: FireBird - Too many Savepoints?
 
Nein, das habe ich bisher nicht gemacht müßte ich mir anschauen wie ich diese Felder indiziert bekomme.

Hansa 27. Aug 2008 12:14

Re: FireBird - Too many Savepoints?
 
Zitat:

Zitat von TUX_der_Pinguin
..Was sind den diese Savepoints überhaupt und wozu sind diese gut, ich raff das noch nicht so ganz.

Du musst endlich anfangen, Transaktionen zu verstehen. mkinzler hat jetzt oft genug von "Teiltransaktionen" gesprochen. Beispiel : wöchentliche Lieferung und es wird in Folgewoche wieder was zurückgenommen. Das soll auf eine Rechnung.

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:

Zitat von TUX_der_Pinguin
...ich beführchte das FireBird nie so flott sein kann/wird wie z.b.
ein Dedizierter MySQL Server aber das ist ein anderes Thema.

Du beschäftigst dich ja anscheinend nicht mit Grundlagen. Warum wird überhaupt die FB embedded Version für die Entwicklung benutzt ? :shock: Zeos kann sowieso nur vernünftig mit einer Transaktion umgehen, wenn überhaupt.

TUX_der_Pinguin 27. Aug 2008 12:33

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.

mkinzler 27. Aug 2008 12:40

Re: FireBird - Too many Savepoints?
 
Zitat:

Warum man jetzt FireBird Embedded nicht für die Entwicklung nutzen sollte, verstehe ich nicht.
Währrend der Entwicklung bietet sich es an die Serverversion zu nehmen, so dass parallel von der IDE, deinem Programm und einem Admintool auf die Datenbank zugegriffen werden kann.
Zitat:

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.
Eine SavePoint würde ich nur machen wenn eine Tranaktion aus sehr vielen Operationen besteht. Starte die Tranaktion manuell und rufe nur in einem bestimmten Intervall (z.B. Anzahl von Inserts) Commit auf.

Hansa 27. Aug 2008 12:57

Re: FireBird - Too many Savepoints?
 
Sieht so aus, als hätteste Transaktionen immer noch nicht ganz gerafft.

Zitat:

Zitat von TUX_der_Pinguin
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.
...

Was ist schlimm daran, einen Datenbank-Server zu installieren ? Ein paar Klicks zu machen ? Embedded ist wesentlich komplizierter und die paar MB interessieren heute nicht mehr.

Und die Fahrschule ist wirklich hervorragendes Beispiel. Du lernst Autofahren mit einem embedded Einrad. :mrgreen:

TUX_der_Pinguin 27. Aug 2008 14:02

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:

Zitat von mkinzler
Eine SavePoint würde ich nur machen wenn eine Tranaktion aus sehr vielen Operationen besteht. Starte die Tranaktion manuell und rufe nur in einem bestimmten Intervall (z.B. Anzahl von Inserts) Commit auf.

Ich schau mir das mal an, zur Zeit läuft es ja bis auf ein paar kleinigkeiten, hab noch irgendwo einen Gedankenfehler
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.

mschaefer 27. Aug 2008 14:23

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

mkinzler 27. Aug 2008 14:27

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 07:52 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