Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TIBTransaction.Commit schließt Datenverbindung? (https://www.delphipraxis.net/44283-tibtransaction-commit-schliesst-datenverbindung.html)

Ralf Stehle 16. Apr 2005 22:43

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:
IBDataSet.Post;
TIBTransaction.Commit
Nach TIBTransaction.Commit wird ein leeres DBGrid angezeigt
Erst nach IBDataSet.Active := True werden die Daten wieder angezeigt

Mach ich das was falsch oder ist das normal?


Ralf Stehle

MagicAndre1981 16. Apr 2005 22:49

Re: TIBTransaction.Commit schließt Datenverbindung?
 
Ja das ist normal.
Mit
Delphi-Quellcode:
IBTransaction.CommitRetaining;
bleibt die Datenbindung aber bestehen.

André

Ralf Stehle 16. Apr 2005 23:14

Re: TIBTransaction.Commit schließt Datenverbindung?
 
Danke, mit IBTransaction.CommitRetaining funktioniert es bestens

Lemmy 17. Apr 2005 07:05

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:
procedure SQLUpdate;
begin
  GridDataset.Close;
  if Transaction.InTransaction then
    Transaction.Commit;
  Transaction.StartTransaction;
  GridDataSet.Open;
end;
Nach dem Post rufst Du einfach diese Proc auf und alles ist in Ordnung.

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

Marcel Gascoyne 17. Apr 2005 07:16

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

cugar 6. Jan 2007 16:01

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

mojo777 6. Jan 2007 22:33

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ß

Artur 8. Jan 2007 18:13

Re: TIBTransaction.Commit schließt Datenverbindung?
 
Hi,

ich habe es bisher mit TBookmark gemacht.
Da dürfte doch auch nichts dagegen sprechen:

Delphi-Quellcode:
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;
Ciao,

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