Einzelnen Beitrag anzeigen

Cashew

Registriert seit: 15. Mär 2017
24 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: AnyDAC - FetchBlobs committed Transaktion nicht

  Alt 7. Mär 2018, 07:51
Hallo zusammen,

vielen Dank für die Antworten!

@hoika
Meines Wissens nach bleibt eine Transaktion solang geöffnet, bis der zugrundeliegende SQL Command abgearbeitet ist... Zumindest kann man es so bei einer TADQuery nachvollziehen. Werden über einen SQL Befehl (TADQuery wird verwendet) z.B. 500 Datensätze abgefragt und sind die FetchOptions wie folgt eingestellt: RowSetSize = 50 / Mode = fmOnDemand, dann wird beim Open der TADQuery eine Transaktion gestartet, diese wird dann erst geschlossen, wenn alle 500 Datensätze eingelesen sind. Würde ich über meinen SQL Befehl aber nur 10 Datensäte abrufen, dann würde die Transaktion unmittelbar nach dem Open wieder geschlossen, da die Ergebnissmenge (10 Datensätze) kleiner ist wie die RowSetSize (50 "Datensätze").

AutoCommit bei einer FireBird Datenbank bedeutet, dass die AnyDAC (FireDAC) Komponente automatisch Transaktionen startet und wieder beendet (TxOptions = AutoStart und AutoStop sind aktiv).

Als DB verwenden wir eine FireBird Version 2.5

@Delphi.Narium
Das DataSet ist nach dem Laden der Blobs nicht im EditModus (haben eine art Navigator auf der Form der das sofort anzeigen würde)... Auch das TDBMemo trifft keine Schuld, da beim Laden von Blob Daten über ein Grid (TXDBGrid) das gleiche Verhalten auftritt.

Wie bereits erwähnt, AutoCommit bewirkt, dass die AnyDAC (FireDAC) Transaktionen selbständig startet und beendet, also StartTransaction und Commit / Rollback.

@Quitzlinga
Wir sprechen hier von einer AnyDAC Komponente... Mittlerweile von Embarcadero in FireDAC umbenannt... Ich glaube hier hat mein Thread Titel für Verwirrung gesorgt


Das Problem liegt bei uns an den geänderten FetchOptions.Items Einstellungen... Hier haben wir fiBlobs ausgeschlossen, was dafür sorgt, dass die Blobs nachgelesen werden müssen... Hier ist es dann wohl völlig normal das im AutoCommit Modus eine Transaktion gestartet wird und erst mal offen bleibt...

Wäre für uns soweit nicht tragisch... Nur wenn wir jetzt explizit eine Transaktion starten wollen haben wir das Problem das eine Transaktion bereits geöffnet ist...
FireBird würde verschachtelte Transaktionen unterstüten, aber eine übergeordnete Transaktion kann die Änderungen einer Transaktion die innerhalb der übergeordneten Transaktion gestartet und committed wurde, durch ein Rollback wieder aufheben... Unser Beispiel würde z.B. wie folgt aussehen:
  1. AnyDAC (FireDAC) startet aufgrund des AutoCommit Modus die Transaktion Nr. 1
  2. Innerhalb dieser Transaktion wird eigenständig eine Transaktion Nr. 2 gestartet
  3. Commit der Transaktion Nr. 2
  4. AnyDAC (FireDAC) macht, warum auch immer, einen Rollback
  5. Führt dazu das die Änderungen der Transaktion Nr. 2 auch mit rückgängig gemacht werden

Im Endeffekt bleibt uns wahrscheinlich nichts anderes übrig, wie die Transaktionen die von der AnyDAC (FireDAC) automatisch gestartet wurden zu beenden, bevor eine eigene Transaktion gestartet werden muss...

Weiß jemand ob es bei der AnyDAC (FireDAC) eine Möglichkeit gibt den "Inhalt" einer Transaktion auszulesen, also mitzubekommen welche Änderungen durch einen Commit an die Datenbank "gepostet" werden?
What goes arround, comes arround
  Mit Zitat antworten Zitat