Gestion des transactions (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des connexions (FireDAC)


Explique comment gérer les transactions des SGBD en utilisant FireDAC. FireDAC fournit les composants TFDConnection et TFDTransaction pour vous aider à gérer les transactions de base de données.

Informations générales

Par défaut, l'application FireDAC fonctionne en mode de validation automatique, dans lequel une transaction est automatiquement démarrée par FireDAC quand elle est requise, puis validée quand l'exécution de la commande est réussie ou annulée en cas d'échec. La validation automatique est contrôlée par la propriété TFDTxOptions.AutoCommit. Ce mode est simple d'utilisation pour l'application, mais il :

  • ralentit les mises à jour multiples d'une base de données.
  • ne vous permet pas de réaliser d'autres opérations de base de données dans une même transaction.
  • ne peut pas être prolongé dans le temps.

L'application peut aussi utiliser le contrôle de transaction explicite. Pour cela, utilisez les méthodes StartTransaction, Commit, Rollback de TFDConnection. Une alternative consiste à utiliser le composant TFDTransaction.

Remarque : L'utilisation du composant TFDTransaction est facultative dans FireDAC.

FireDAC fournit les propriétés Isolation, ReadOnly, Params, qui vous permettent de contrôler le mode de transaction. Elles s'appliquent aux transactions en mode de validation automatique et explicites. Tous les modes ne sont pas supportés par le SGBD (par exemple le mode lecture seule), car FireDAC utilise un mode moins restrictif. Notez que tous les paramètres seront uniquement appliqués aux transactions suivantes.

Voici le code standard utilisant une transaction explicite :

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

Le composant TFDTransaction encapsule la fonctionnalité de contrôle de transaction dans un composant. Dans la pratique, il offre la même fonctionnalité que TFDConnection pour les transactions, mais il vous permet de grouper les commandes et les ensembles de données en les liant à un objet transaction spécifique. Tout d'abord, cela fait référence au support des transactions actives multiples, c'est-à-dire aux fonctionnalités Interbase et au serveur Firebird.

TFDTxOptions.Params peut servir à spécifier des attributs transactionnels spécifiques au SGBD. Pour le moment, seul le pilote Firebird / InterBase supporte ces attributs. Chaque attribut doit être spécifié sur une ligne distincte. Il correspond aux paramètres transactionnels isc_tpb_<nom de l'attribut>.

Transactions imbriquées

Même si aucun système de gestion de base de données supporté ne gère les transactions imbriquées, elles sont émulées par FireDAC à l'aide de points de sauvegarde (savepoints). Ainsi, l'appel à la méthode StartTransaction d'imbrication ne démarre pas une nouvelle transaction et ne déclenche pas une exception, mais place un point de sauvegarde. Si un SGBD ne supporte pas les points de sauvegarde, l'exception "Cette capacité n'est pas supportée" est déclenchée.

Pour désactiver une transaction imbriquée, définissez TFDTxOptions.EnableNested sur False. Ensuite, l'appel à la méthode StartTransaction d'imbrication déclenche une exception.

L'appel correspondant à Commit libère un point de sauvegarde et Rollback annule les transactions jusqu'à un point de sauvegarde. Par exemple :

// 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;

Remarque : Une transaction imbriquée utilise les paramètres de la transaction la plus élevée.

Transactions continues

Les méthodes CommitRetaining et RollbackRetaining sont similaires aux méthodes Commit et Rollback, mais elles ne terminent pas la transaction. Celle-ci reste donc active après ces appels. Les serveurs Firebird / InterBase supportent cette fonctionnalité au niveau du noyau du SGBD. Pour tous les autres systèmes de gestion de base de données, cette fonctionnalité est émulée à l'aide des appels à Commit / Rollback et StartTransaction.

Transactions actives multiples

Firebird et InterBase prennent en charge les transactions actives multiples au niveau du noyau du SGBD. Certaines commandes peuvent ainsi être réalisées dans un contexte transactionnel, d'autres dans le second contexte transactionnel, etc. Pour prendre en charge cette fonctionnalité, FireDAC fournit le composant TFDTransaction. Son instance unique vous permet de gérer des transactions uniques à un moment donné.

Les propriétés TFDCustomConnection peuvent être utilisées pour configurer des objets transaction par défaut :

  • Transaction - objet transaction par défaut pour toutes les commandes.
  • UpdateTransaction - objet transaction par défaut pour toutes les commandes de mise à jour, utilisé pour valider les mises à jour provenant des ensembles de données FireDAC. Notez que l'objet UpdateTransaction ne sera par exemple pas utilisé pour une requête UPDATE explicitement spécifiée pour le composant TFDQuery.

TFDCustomQuery et d'autres composants ont des propriétés similaires :

  • Transaction - objet transaction explicite à utiliser pour exécuter la requête SQL ;
  • UpdateTransaction - objet transaction explicite à utiliser pour valider les mises à jour provenant de l'ensemble de données.

En général, le meilleur moyen de configurer des objets transaction pour une application Firebird / InterBase est le suivant :

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;

Remarque : Vous pouvez utiliser plusieurs composants TFDTransaction pour les autres systèmes de gestion de base de données. Ensuite, tous les composants TFDTransaction partagent la même transaction.

Transactions et curseurs

Un SGBD associe un curseur ouvert au contexte transactionnel ayant servi à son ouverture. Quand la transaction se termine, le SGBD peut invalider les curseurs actifs. Le comportement exact dépend du SGBD :

SGBD Action
Microsoft Access Invalide un curseur sur StartTransaction / Commit / Rollback.
Firebird Invalide un curseur sur Commit / Rollback.
Informix <rien>
InterBase Invalide un curseur sur Commit / Rollback.
IBM DB2 Invalide un curseur sur Rollback.
MySQL Invalide un curseur sur StartTransaction / Commit / Rollback.
Oracle <rien>
PostgreSQL Invalide un curseur sur Commit / Rollback.
SQLite Invalide un curseur sur Rollback.
SQL Anywhere <rien>
SQL Server Invalide un curseur sur StartTransaction / Commit / Rollback.
Base de données Teradata <rien>

Quand FireDAC découvre une commande de contrôle des transactions qui entraîne l'invalidation d'un curseur, il réalise une action spécifiée par FetchOptions.AutoFetchAll et libère le curseur.

Remarque : Les serveurs Firebird / InterBase invalident l'instruction préparée quand la transaction se termine. Par conséquent, le mode de validation automatique peut entraîner une dégradation des performances sur ces systèmes de gestion de base de données.

Voir aussi

Exemples