AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi TIBTransaction.Commit schließt Datenverbindung?
Thema durchsuchen
Ansicht
Themen-Optionen

TIBTransaction.Commit schließt Datenverbindung?

Ein Thema von Ralf Stehle · begonnen am 16. Apr 2005 · letzter Beitrag vom 8. Jan 2007
Antwort Antwort
Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#1

TIBTransaction.Commit schließt Datenverbindung?

  Alt 16. Apr 2005, 23:43
Datenbank: Firebird • Version: 1.5 • Zugriff über: TibDataSet, TiBDatabase-Komponenten
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
Ralf Stehle
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat
Benutzerbild von MagicAndre1981
MagicAndre1981

Registriert seit: 4. Jun 2004
Ort: Nordhausen
2.214 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: TIBTransaction.Commit schließt Datenverbindung?

  Alt 16. Apr 2005, 23:49
Ja das ist normal.
Mit IBTransaction.CommitRetaining; bleibt die Datenbindung aber bestehen.

André
André
  Mit Zitat antworten Zitat
Ralf Stehle

Registriert seit: 8. Aug 2003
124 Beiträge
 
Delphi 7 Professional
 
#3

Re: TIBTransaction.Commit schließt Datenverbindung?

  Alt 17. Apr 2005, 00:14
Danke, mit IBTransaction.CommitRetaining funktioniert es bestens
Ralf Stehle
ralfstehle@yahoo.de
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.381 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: TIBTransaction.Commit schließt Datenverbindung?

  Alt 17. Apr 2005, 08:05
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
  Mit Zitat antworten Zitat
Benutzerbild von Marcel Gascoyne
Marcel Gascoyne

Registriert seit: 18. Nov 2003
Ort: Uetersen
271 Beiträge
 
Delphi 2005 Architect
 
#5

Re: TIBTransaction.Commit schließt Datenverbindung?

  Alt 17. Apr 2005, 08:16
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
Marcel Gascoyne
Der Fehler sitzt immer vor der Tastatur
  Mit Zitat antworten Zitat
cugar

Registriert seit: 6. Jan 2007
149 Beiträge
 
Delphi XE Professional
 
#6

Re: TIBTransaction.Commit schließt Datenverbindung?

  Alt 6. Jan 2007, 17:01
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
  Mit Zitat antworten Zitat
mojo777

Registriert seit: 10. Sep 2003
402 Beiträge
 
#7

Re: TIBTransaction.Commit schließt Datenverbindung?

  Alt 6. Jan 2007, 23:33
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ß
Muh macht die kUh
  Mit Zitat antworten Zitat
Artur

Registriert seit: 31. Dez 2006
Ort: Augsburg
70 Beiträge
 
Delphi XE8 Enterprise
 
#8

Re: TIBTransaction.Commit schließt Datenverbindung?

  Alt 8. Jan 2007, 19:13
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
Artur
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 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