Verwalten von Transaktionen (FireDAC)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Verbindungen (FireDAC)


In diesem Thema wird beschrieben, wie DBMS-Transaktionen mit FireDAC verwaltet werden. FireDAC enthält die Komponenten TFDConnection und TFDTransaction, mit denen Sie Datenbanktransaktionen behandeln können.

Allgemeine Informationen

Standardmäßig arbeitet die FireDAC-Anwendung im automatischen Übergabemodus ("auto-commit"), in dem eine Transaktion bei Bedarf automatisch von FireDAC gestartet und bei erfolgreicher Anweisungsausführung übergeben bzw. bei einem Fehler zurückgesetzt wird. Die automatische Übergabe wird mit der Eigenschaft TFDTxOptions.AutoCommit gesteuert. Der automatische Übergabemodus kann von der Anwendung einfach genutzt werden, aber er:

  • verlangsamt mehrere Aktualisierungen einer Datenbank.
  • lässt die Ausführung mehrerer Datenbankoperationen in einer einzelnen Transaktion nicht zu.
  • kann zeitlich nicht verlängert werden.

Alternativ kann die Anwendung die explizite Transaktionssteuerung verwenden. Verwenden Sie dazu die Methoden StartTransaction, Commit und Rollback von TFDConnection. Eine Alternative dazu ist die Verwendung der Komponente TFDTransaction.

Hinweis: Die Verwendung der Komponente TFDTransaction ist in FireDAC optional.

FireDAC stellt zum Steuern des Transaktionsmodus die Eigenschaften Isolation, ReadOnly und Params bereit. Sie können für automatische Übergabe- und explizite Transaktionen angewendet werden. Nicht alle Modi werden vom DBMS unterstützt, z. B. der schreibgeschützte Modus, weil FireDAC einen weniger restriktiven Modus verwendet. Alle Einstellungen werden nur für die nächsten Transaktionen übernommen.

Der Standardcode für explizite Transaktionen lautet:

FDConnection1.StartTransaction;
try
  FDQuery1.ExecSQL;
  ....
  FDQuery1.ExecSQL;
  FDConnection1.Commit;
except
  FDConnection1.Rollback;
  raise;
end;

Die Komponente TFDTransaction kapselt die Funktionalität für die Transaktionssteuerung in einer Komponente. Praktisch gesehen bietet sie dieselbe Transaktionsfunktionalität wie TFDConnection, ermöglicht aber die Gruppierung von Anweisungen und Datenmengen durch Verknüpfen mit einem bestimmten Transaktionsobjekt. Dies bezieht sich auf die Unterstützung mehrerer aktiver Transaktionen, d. h. auf die Features von InterBase- und Firebird-Servern.

Mit TFDTxOptions.Params können die DBMS-spezifischen Transaktionsattribute festgelegt werden. Derzeit unterstützt nur der Firebird-/InterBase-Treiber solche Attribute. Jedes Attribut muss in einer separaten Zeile angegeben werden. Die Attribute entsprechen den Transaktionsparametern isc_tpb_<Attributname>.

Verschachtelte Transaktionen

Obwohl die unterstützten Datenbankmanagementsysteme verschachtelte Transaktionen nicht unterstützen, werden sie von FireDAC durch Speicherpunkte emuliert. Das bedeutet, dass mit dem verschachtelten StartTransaction-Aufruf keine neue Transaktion gestartet und keine Exception ausgelöst, sondern ein Speicherpunkt gesetzt wird. Wenn ein DBMS keine Speicherpunkte unterstützt, dann wird die Exception "Funktion wird nicht unterstützt" ausgelöst.

Setzen Sie TFDTxOptions.EnableNested auf False, um eine verschachtelte Transaktion zu deaktivieren. Dann löst der verschachtelte StartTransaction-Aufruf eine Exception aus.

Der zugehörige Commit-Aufruf gibt einen Speicherpunkt frei, und Rollback setzt einen Speicherpunkt zurück. Zum Beispiel:

// start new transaction
FDConnection1.StartTransaction;
try
  FDQuery1.ExecSQL;
  ....

  // set savepoint
  FDConnection1.StartTransaction;
  try
    FDQuery1.ExecSQL;
    ....

    // release savepoint
    FDConnection1.Commit;
  except
    // rollback to savepoint
    FDConnection1.Rollback;
    raise;
  end;

  // commit transaction
  FDConnection1.Commit;

except
  // rollback transaction
  FDConnection1.Rollback;
  raise;
end;

Hinweis: Eine verschachtelte Transaktion verwendet die Einstellungen der obersten Transaktion.

Fortlaufende Transaktionen

Die Methoden CommitRetaining und RollbackRetaining entsprechen den Methoden Commit und Rollback, aber sie beenden die Transaktion nicht. Deshalb bleibt die Transaktion nach diesen Aufrufen aktiv. Die Firebird-/InterBase-Server unterstützen dieses Feature auf der DBMS-Hauptebene. Für alle anderen Datenbankmanagementsysteme wird dieses Feature durch Aufrufe von Commit/Rollback und StartTransaction emuliert.

Mehrere aktive Transaktionen

Firebird und InterBase unterstützen mehrere aktive Transaktionen auf der DBMS-Hauptebene. Das bedeutet, dass einige Anweisungen in einem Transaktionskontext, andere im zweiten Transaktionskontext usw. durchgeführt werden. Zur Unterstützung dieses Features stellt FireDAC die Komponente TFDTransaction bereit. Ihre Einzelinstanz ermöglicht die Behandlung einzelner Transaktionen zu jedem gegebenen Zeitpunkt.

Mit den Eigenschaften von TFDCustomConnection können Standardtransaktionsobjekte eingerichtet werden:

  • Transaction – das Standardtransaktionsobjekt für alle Anweisungen.
  • UpdateTransaction – das Standardtransaktionsobjekt für alle Aktualisierungsanweisungen, die zum Eintragen von Aktualisierungen aus FireDAC-Datenmengen verwendet werden. UpdateTransaction wird beispielsweise nicht für eine UPDATE-Abfrage verwendet, die explizit für die Komponente TFDQuery angegeben ist.

TFDCustomQuery und andere Komponenten haben ähnliche Eigenschaften:

  • Transaction – das explizite Transaktionsobjekt zum Ausführen der SQL-Abfrage.
  • UpdateTransaction – das explizite Transaktionsobjekt zum Eintragen von Aktualisierungen aus der Datenmenge.

Im Allgemeinen eignet sich Folgendes am besten zur Einrichtung von Transaktionsobjekten für Firebird-/InterBase-Anwendungen:

UpdateTransaction: TFDTransaction;
ReadTransaction: TFDTransaction;
...
// setup transaction for updating commands: read_committed, rec_version, nowait
UpdateTransaction.Connection := FDConnection1;
FDConnection1.UpdateOptions.LockWait := False;
UpdateTransaction.Options.ReadOnly := False;
UpdateTransaction.Options.Isolation := xiReadCommitted;
...
ReadTransaction.Connection := FDConnection1;
ReadTransaction.Options.ReadOnly := True;
ReadTransaction.Options.Isolation := xiReadCommitted;
...
SelectQuery.Transaction := ReadTransaction;
SelectQuery.UpdateTransaction := UpdateTransaction;

Hinweis: Sie können mehr als eine TFDTransaction für andere Datenbankmanagementsysteme verwenden. Dann nutzen alle TFDTransaction-Komponenten dieselbe Transaktion.

Transaktionen und Cursor

Ein DBMS ordnet einen geöffneten Cursor dem Transaktionskontext zu, in dem er geöffnet wurde. Wenn die Transaktion beendet wird, kann das DBMS die aktiven Cursor freigeben. Das genaue Verhalten hängt vom jeweiligen DBMS ab:

DBMS Aktion
Microsoft Access Gibt einen Cursor bei StartTransaction/Commit/Rollback frei.
Firebird Gibt einen Cursor bei Commit/Rollback frei.
Informix <keine Aktion>
InterBase Gibt einen Cursor bei Commit/Rollback frei.
IBM DB2 Gibt einen Cursor bei Rollback frei.
MySQL Gibt einen Cursor bei StartTransaction/Commit/Rollback frei.
Oracle <keine Aktion>
PostgreSQL Gibt einen Cursor bei Commit/Rollback frei.
SQLite Gibt einen Cursor bei Rollback frei.
SQL Anywhere <keine Aktion>
SQL Server Gibt einen Cursor bei StartTransaction/Commit/Rollback frei.
Teradata Database <keine Aktion>

Wenn FireDAC auf eine Anweisung zur Transaktionssteuerung trifft, die die Freigabe des Cursors zur Folge hat, führt es eine in FetchOptions.AutoFetchAll angegebene Aktion aus und gibt den Cursor frei.

Hinweis: Die Firebird-/InterBase-Server heben die vorbereitete Anweisung am Ende der Transaktion auf. Deshalb kann der automatische Übergabemodus zu Leistungseinbußen auf diesen Datenbankmanagementsystemen führen.

Siehe auch

Beispiele