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

  1. #1
    Membre actif
    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
    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

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Membre éprouvé
    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
    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 expérimenté
    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 ?