IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Suis-je sur le bon chemin pour la gestion manuelle des transactions avec Firedac


Sujet :

Bases de données Delphi

  1. #1
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 401
    Points : 294
    Points
    294
    Par défaut Suis-je sur le bon chemin pour la gestion manuelle des transactions avec Firedac
    Bonjour a tous.
    svp j'aimerais bien savoir si je suis sur le bon chemin pour la gestion manuelle des transactions avec Firedac avec Firebird comme SGBD.

    j'utilise un FDTransaction1 (transaction Global)pour la la connextion FDConnection.

    Pour mes FDTable et FDQuery j'utilise un FDTransaction2.


    Pour les paramètres des Composants FDTransaction1 et FDTransaction2 :

    AutoCommit = False
    AutoStart = False
    AutoStop = False

    apres dans l'evenement AfterPost du FDTable1 , je gère la transaction comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.FDTable1AfterPost(DataSet: TDataSet);
    begin
      try
        FDTransaction2.Commit;
     
      except
        FDConnection2.Rollback;
     
      end;
      FDTable1.Open;
    end;
    svp, Suis je sur le bon chemin?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    c'est bizarre de mettre le Commit dans un AfterPost. Cela revient à faire un AutoCommit sans Cache

    La transaction c'est idéal pour modifier plusieurs tables d'un coup et garantir que la DB forme un ensemble cohérent, si cela échoue à moitié, c'est comme si rien ne s'était passé, laissant la base "propre"
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,


    deux points :
    j'utilise un FDTransaction1 (transaction Global)pour la la connextion FDConnection.
    Pour mes FDTable et FDQuery j'utilise un FDTransaction2.
    Par défaut, même si non indiqué, FDConnection utilisera une Transaction donc pas forcément besoin d'en poser une
    idem pour les FDTable ou FDQuery par défaut ces composants utilisent la transaction indiquée dans FDConnection et ... cf au dessus.


    je plussoie la réflexion de ShaiLeTroll dans un AfterPost cela n'a pas beaucoup de sens.

    Pour ce qui est du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FDTable1AfterPost(DataSet: TDataSet);
    begin
      try
        FDTransaction2.Commit;
      except
        FDConnection2.Rollback;
      end;
      FDTable1.Open;
    C'est le FDTable1.Open qui me chagrine puisqu'il est déjà ouvert donc instruction inutile AMHA. Pire ce serait des tables contenant beaucoup de lignes et que le open devait faire quelque chose, bonjour les délais
    Je n'ai pas vu de FDTransaction2.StartTransaction mais bon, cela doit être quelque part sinon pas de commit
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    le "open" d'une table en before ou after d'une modification de l'un de ses enregistrements me laisse tout aussi perplexe, quelle en était la raison ?

  5. #5
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    401
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 401
    Points : 294
    Points
    294
    Par défaut
    Merci a vous tous les experts d'avoir répondre a ma question.

    1- Pour le FDTransaction2.StartTransaction je l'ai mis dans l'événement BeforePost.
    2- Pour FDTable1.Open; parce qu’après un commit de transaction la table se ferme.
    3- meme pour les FDquery j'utilise ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        FDTransaction2.StartTransaction;
      try
        FDQuery1.ExecSQL ;
        FDTransaction2.Commit;
      except
        FDConnection2.Rollback;
      end;
    Donc , comment gérez vous manuellement les transaction avec Firedac?
    (un exemple si c'est possible svp.)

  6. #6
    Membre chevronné
    Avatar de free07
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 930
    Points : 1 959
    Points
    1 959
    Par défaut
    Comme l'a dit ShaiLeTroll, les transactions sont surtout utilisées lors de la modification de plusieurs tables.

    Prenons exemple d'une gestion de facturation, bien souvent on utilise deux tables, une tables pour sauvegarder les entêtes des factures et une autre table pour sauvegarder les lignes de chaque facture.

    Donc lors d'une insertion d'une ligne d'une facture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    try
       FDTransaction.StartTransaction;
        - Insérer la ligne dans la tables des lignes de factures
        - Modifier entête de la table des entêtes pour prendre en compte la nouvelle ligne
       FDQuery.ExecSQL ;
       FDTransaction.Commit;
    except
        FDTransaction.Rollback;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not  FDTransaction.InTransaction then
        FDTransaction.StartTransaction
    Pourquoi le test InTransaction ? AMHA cela sert à rien car si l'on est déjà dans une transaction il faut savoir ce qu'il s'est passé auparavant, faut il un commit ? un rollback ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2016, 11h34
  2. Réponses: 5
    Dernier message: 16/11/2015, 18h42
  3. Réponses: 3
    Dernier message: 04/05/2009, 12h20
  4. Trouver le bon chemin pour un fichier.
    Par Yepazix dans le forum Débuter
    Réponses: 3
    Dernier message: 13/02/2009, 09h57
  5. Réponses: 5
    Dernier message: 03/12/2007, 23h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo