![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: TibDataSet, TiBDatabase-Komponenten
TIBTransaction.Commit schließt Datenverbindung?
Sobald ich Daten eingegeben habe und speichern möchte, geht meine Datenverbindung futsch:
Delphi-Quellcode:
Nach TIBTransaction.Commit wird ein leeres DBGrid angezeigt
IBDataSet.Post;
TIBTransaction.Commit Erst nach IBDataSet.Active := True werden die Daten wieder angezeigt Mach ich das was falsch oder ist das normal? Ralf Stehle |
Re: TIBTransaction.Commit schließt Datenverbindung?
Ja das ist normal.
Mit
Delphi-Quellcode:
bleibt die Datenbindung aber bestehen.
IBTransaction.CommitRetaining;
André |
Re: TIBTransaction.Commit schließt Datenverbindung?
Danke, mit IBTransaction.CommitRetaining funktioniert es bestens
|
Re: TIBTransaction.Commit schließt Datenverbindung?
Guten Morgen,
muss hier mal den Zeigefinger heben und Achtung! rufen. 1. CommitRetaining muss mit sehr großer Vorsicht genossen werden! Bei der Transaktionssteuerung in IB/FB passiert folgendes: Jede Transaktion erhält eine eindeutige Transaktionsnummer. Durch die Multigenerationenarchitektur von IB/FB erhält die Transaktion dann Zugriff auf eine "Kopie" des Datenbestandes, der zum Zeitpunkt des Startes der Transaktion gültig war. Wird diese Transaktion jetzt eine zeitlang mit CommitRetaining bearbeitet, passiert folgendes: Es werden von anderen Clients immer weitere Transaktionen gestartet. Somit steigt der Unterschied zwischen unserer Transaktion (oldest active transaction) und der neuesten Transaktion immer weiter an. Das muss IB/FB aber verwalten, was Systemressourcen und damit Performance benötigt. 2. Es gibt einen viel eleganteren Weg das Problem zu umgehen: Schreibe eine spezielle Prozedur, die das erledigt:
Delphi-Quellcode:
Nach dem Post rufst Du einfach diese Proc auf und alles ist in Ordnung.
procedure SQLUpdate;
begin GridDataset.Close; if Transaction.InTransaction then Transaction.Commit; Transaction.StartTransaction; GridDataSet.Open; end; Zudem ist Dein Code etwas "schlecht" da Du momentan die automatische Transaktionssteuerung und die manuelle Transaktionssteuerung miteinander vermischt. Das ist nicht gut! Hinweis: Selbstverständlich sind die Auswirkungen in Datenbanken mit einer Tabelle und 20 Datensätzen nicht zu spüren. Im Dauerbetrieb machen sich diese allerdings sehr schnell bemerkbar! Dennoch sollte auch bei kleinen Appl. auf solche Dinge Rücksicht genommen werden, ist zum einen nicht schwer, zum anderen schleift sich da nicht etwas ein, was nciht sein darf.... Grüße Lemmy |
Re: TIBTransaction.Commit schließt Datenverbindung?
Du solltest Dir das Konzept von Transaktionen verinnerlichen. Die IBX Komponenten stellen Dir immer Live Daten zur Verfügung.
Wenn Du Deine Änderungen nun mit Commit bestätigst werden diese in die Datenbank geschrieben. Danach sind Deine (sichtbaren) Daten nicht mehr gültig. Durch das Setzen von Active := True in Deinen DataSet machst Du nichts anderes als eine neue Transaktion zu starten. CommitRetaining ist eine Möglichkeit, wenn auch nicht die sauberste. Hintergrund: Es wird ebenfalls eine neue Transaktion gestartet, allerdings mit der gleichen internen ID wie die Original-Transaktion. Solange Du diese nicht mit einem richtigen Commit bestätigst ist diese auf dem Server noch offen. Der Aufräumdienst (Garbage Collector) von Interbase/Firebird wird diese Transaktion daher nicht entfernen. Wenn dies nun viele Anwendungen machen wird Dein Server irgendwann in die Knie gehen. Ein Rollback macht übrigens nur die Änderungen bis zum vorherigen CommitRetaining rückgängig. Daher scheint mir ein sinnvoller Einsatz nur für Interbase/Firebird Installationen sinnvoll die noch keine Savepoints unterstützen. Besser sind Komponenten die im Unidirektionalen Modus arbeiten. Zuerst die Daten per SELECT lesen und lokal speichern, statt die Transaktion offen zu halten. Änderungen werden dann per UPDATE oder INSERT in einer neuen Transaktion gespeichert. Schau Dir doch mal die dbExpress Komponenten und das ClientDataSet an, die arbeiten mit unidirektionalen Verbindungen. Gruß, Marcel |
Re: TIBTransaction.Commit schließt Datenverbindung?
Hallo Leute!
Fange grade mit InterBase an, die Erklärung mit Commit hat mir gerade geholfen. Meine Frage wäre: Wir kriege ich meinen letzten Datensatz wieder an der gleichen Stelle in der Tabelle angezeigt? Muss die Tabelle mit z.B. Locate durchsucht werden, oder geht es etwas eleganter?? Viele Grüsse cugar |
Re: TIBTransaction.Commit schließt Datenverbindung?
hi,
jupp. mit locate geht das. so mache ich das auch bei kleinen (sehr kleinen <50) datensätzen. also vorher die id merken und dann locate. gruß |
Re: TIBTransaction.Commit schließt Datenverbindung?
Hi,
ich habe es bisher mit TBookmark gemacht. Da dürfte doch auch nichts dagegen sprechen:
Delphi-Quellcode:
Ciao,
procedure TProjectForm.StartNewTransaction;
var aBookmark : TBookmark; begin with DM1 do begin aBookmark := ProjGridQuery.GetBookmark; if IBTransaction1.InTransaction then IBTransaction1.Commit; IBTransaction1.StartTransaction; ProjGridQuery.Open; ProjGridQuery.GotoBookmark(aBookmark); end; end; Artur |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 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