Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind (https://www.delphipraxis.net/189475-append-und-post-bei-tabellen-wenn-transaktionen-im-spiel-sind.html)

Der schöne Günther 16. Jun 2016 10:43

Datenbank: SQLite • Version: 3 • Zugriff über: FireDAC

Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Ich habe ein Verständnisproblem. Ich füge mittels
Delphi-Quellcode:
Append()
und
Delphi-Quellcode:
Post()
eine neue Zeile in einer Tabelle ein. Davor sage ich
Delphi-Quellcode:
myConnection.StartTransaction()
. Nehmen wir an, irgendwo kommt es zu einem Fehler, und ich möchte alle Änderungen rückgängig machen. Hierfür brauche ich
Delphi-Quellcode:
myConnection.Rollback()
. Leider trägt er die Zeile doch in die Tabelle ein.

Wie kann ich das verhindern? So hätte ich mir die Transaktion auch sparen können- Sie ist völlig wirkungslos.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
   FDConnection1.StartTransaction();
   try
      FDTable1.Append();
      FDTable1.FieldByName('someField').AsString := 'Hallo Welt';
      FDTable1.Post();

      if CheckBox1.Checked then raise EProgrammerNotFound.Create('derp');
      FDConnection1.Commit();
   except
      FDConnection1.Rollback(); raise;
   end;
end;

Aviator 16. Jun 2016 11:13

AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Transaktionen beziehen sich meines Wissens nach nur auf SQL-Befehle wie
SQL-Code:
INSERT INTO ...
oder
SQL-Code:
DELETE FROM ...
. Append und Post werden wohl direkt in die Datenbank geschrieben. Ich benutze zwar kein FireDAC, aber ADO mit MSSQL. Und dort funktioniert es eigentlich schon.

mkinzler 16. Jun 2016 11:34

AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Möglicherweise läuft es aber nur in einem anderen Transaktionskontext.

Der schöne Günther 16. Jun 2016 11:37

AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Ich bin kein Datenbank-Profi. Was bedeutet "anderer Kontext"? Ich hätte gedacht dass, wenn ein Append/Post implizit innen drin auch noch Transaktionsspaß hat, dieser von der äußeren (meiner expliziten) erfasst wird...

Lemmy 16. Jun 2016 11:39

AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1340304)
Ich habe ein Verständnisproblem. Ich füge mittels
Delphi-Quellcode:
Append()
und
Delphi-Quellcode:
Post()
eine neue Zeile in einer Tabelle ein. Davor sage ich
Delphi-Quellcode:
myConnection.StartTransaction()
.

was sagt denn die Eigenschaft "AutoCommit", "AutoTransaction" oder vergleichbar bei der Transaction Komponente bzw Table/Query Komponente?

Manuelle und automatische Transaktionssteuerung sollte man tunlichst nicht miteinander mischen....

hstreicher 16. Jun 2016 11:39

AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Aviator: Nein

Transactionen betreffen alle Vorgänge die Daten in einer Datenbank ändern

anderer Kontext heist dass verschiedene Tables oder Querys verschiedenen Transactionen zugeordnet werden können ,
oder dass die Transaction beim Post implizit commited wurde und damit der Rollback ins leere läuft

mfg Hannes

mikhal 16. Jun 2016 11:44

AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Hänge die Transaction-Methoden in die entsprechenden Ereignisse deiner Query / Table: BeforeInsert => Start Transaction, AfterPost / AfterCancel => End Transaction, etc.

Bei einer Exception rufst du dann nicht die Transaction-Methoden ab, sondern die Cancel-Methode deiner Query / Table.

Grüße
Mikhal

Ergänzung: Nicht nur BeforeInsert auch BeforeEdit => Start Transaction

himitsu 16. Jun 2016 12:08

AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Datenbankseitig ist Append auch ein INSERT.

Bezüglich der TDataSet hat Insert und Append nur den einen Unterschied, dass Insert den neuen Record (Datensatz) an der aktuellen Position (RecNo) einfügt und Append hängt den Record am Ende an.
Wenn man ganz viele Datensätze z.B. in ein Memory-Dataset einfügt, dann ist Append oftmals einfach nur etwas schneller, als Insert, da die Speicherverwaltung dort etwas optimaler läuft. (Trifft eventuell auch auf Cached-Updates zu)

Sir Rufo 16. Jun 2016 12:19

AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Delphi-Quellcode:
  try
    ...
  except
    FDConnection1.Rollback();
    FDTable1.Refresh();
    raise;
  end;
Die Daten stehen nicht in der Datenbank, sondern nur in der Table-Komponente ;)

Der schöne Günther 16. Jun 2016 12:48

AW: Append() und Post() bei Tabellen wenn Transaktionen im Spiel sind
 
Ich ... Ich ... Ich glaube, das war es. Ich prüfe noch einmal doppelt und dreifach, das kann doch nicht sein dass es jetzt SO einfach war :thumb:

Vielen Dank, da wäre ich sicher nicht drauf gekommen.8-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:56 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