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