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

Connexion aux bases de données Firebird Discussion :

[Delphi - Firebird] Comment faire bon usage des transactions?


Sujet :

Connexion aux bases de données Firebird

  1. #1
    Membre à l'essai

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 26
    Points : 21
    Points
    21
    Par défaut [Delphi - Firebird] Comment faire bon usage des transactions?
    Bonjour,

    N'ayant pas trouvé d'exemples assez détaillés sur le net, je me permets de faire à nouveau appel à vous pour obtenir de plus amples renseignements sur la gestion des transactions sous Firebird !

    L'appli que je suis en train de développer étant destinée à être multi-utilisateur, me voilà plongée en plein dans le monde des transactions !

    En parcourant le forum et la faq, j'ai pu comprendre que la bonne vieille méthode : un composant TIBDataBase, un composant TIBTransaction et tous les DataSet connectés à la même transaction était loin de permettre de tirer profit au maximum de Firebird !

    Ainsi je me permets de poster ici la méthode que j'emploies actuellement afin que vous puissiez me donner vos avis éclairés...

    Exemple :
    Une première fenêtre présente une DbGrid contenant la liste des clients. Sur l'évènement FormShow, j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     DMPrincipal.IBTransaction.StartTransaction;
       DMprincipal.IBDataSetCLIENTS.Open;
    Sur l'événement OnClick du DbGrid, j'ouvre une autre fenêtre contenant la "fiche" du client sélectionné, on associe à cet événement le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      DMprincipal.IBTransaction.Commit;
      DMprincipal.IBTransaction.StartTransaction;
     
      DMprincipal.IBDataSetClient.ParamByName('numclient').AsInteger := NumClient;
     
      DMPrincipal.IBDataSetClient.Open;
     
      FClient.NumClient := NumClient;
      FClient.ShowModal;
    Ensuite lors de la fermeture de la fiche client, la transaction est à nouveau fermée, puis rouverte afin de "recharger" le DBgrid.

    Voilà, je souhaiterai savoir ce que vous pensez de cette manière de fonctionner?
    De plus, si vous avez des exemples de code utilisant les transactions, n'hésitez pas!

    Merci d'avance pour votre aide..

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Lili21
    Une première fenêtre présente une DbGrid contenant la liste des clients. Sur l'évènement FormShow, j'exécute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     DMPrincipal.IBTransaction.StartTransaction;
       DMprincipal.IBDataSetCLIENTS.Open;
    La première ligne est inutile puisque l'ouverture du Dataset va démarrer la transaction (si celle ci ne l'était pas déjà).


    Citation Envoyé par Lili21
    Sur l'événement OnClick du DbGrid, j'ouvre une autre fenêtre contenant la "fiche" du client sélectionné, on associe à cet événement le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      DMprincipal.IBTransaction.Commit;
      DMprincipal.IBTransaction.StartTransaction;
      DMprincipal.IBDataSetClient.ParamByName('numclient').AsInteger := NumClient;
      DMPrincipal.IBDataSetClient.Open;
      FClient.NumClient := NumClient;
      FClient.ShowModal;
    Ensuite lors de la fermeture de la fiche client, la transaction est à nouveau fermée, puis rouverte afin de "recharger" le DBgrid.
    Voilà, je souhaiterai savoir ce que vous pensez de cette manière de fonctionner?
    J'en conclus que vous utilisez le meme composant transactionnel pour votre grille et votre fiche de mise à jour. Dans ce cas vous n'avez aucun interret à fermer la transaction (en faisant un commit puis de l'ouvrir avec un start) juste avant l'ouverture de votre fiche client. Celà génère du trafic inutile.

    Enfin lorqu'on parle de transaction il faut préciser comment est paramétrée votre transaction sinon nous parlons un peu pour rien.
    Snapshot, read committed, read only table stability, ...

    Si vous n'avez pas configurez le composant transaction il est en mode Snapshot. Dans ce mode vous ne voyez pas les modifications que les autres transactions (de la meme application ou des autres postes) valident. Une fois ouverte, c'est comme si elle prennait une photo de votre base de données.

    En mode read commited vous allez pouvoir voir les modifications validées apportées par les autres. De plus cette transaction sera moins lourde à maintenir pour le serveur.

    Idéalement il faut que la transaction soit de niveau le plus bas possible et la plus courte possible (Le cas idéal étant de ne rien ouvrir et de ne rien toucher ). Dans la pratique (il faut bien travailler ) je vous conseille d'utiliser par défaut le mode read commited (qui est le mode le plus facile à comprendre, car assez 'naturel') avant de vous lancer dans les autres modes. Et d'utiliser plusieures composants transactionnels. Un pour vos grilles (dans cette transaction nous ne faites pas de mise à jour de données, que des lectures) et un autre pour vos mise à jours (cette dernière sera fermée dès que possible par un commit ou rollback).

    Voilà de quoi commencer à vous exercer.

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par Barbibulle
    Dans la pratique (il faut bien travailler ) je vous conseille d'utiliser par défaut le mode read commited (qui est le mode le plus facile à comprendre, car assez 'naturel') avant de vous lancer dans les autres modes. Et d'utiliser plusieures composants transactionnels. Un pour vos grilles (dans cette transaction nous ne faites pas de mise à jour de données, que des lectures) et un autre pour vos mise à jours (cette dernière sera fermée dès que possible par un commit ou rollback).

    Voilà de quoi commencer à vous exercer.
    tu peut expliqué plus, j'ai déjà lu que snapshot est le meilleur, et là tu met tout mes idée en gris
    en plus, j'ai jamai éssye d'utlisé plus d'un composant TIBTransact, en peut le faire? et que raport tt sa pour mon aplis,
    autre chose, tt est transactionnel, même select?? sa veut dire que je dois commité aprés chaque select?? pas vraie non ?
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

Discussions similaires

  1. [Data] Comment controler le bon fonctionnement des transactions?
    Par irnbru dans le forum Spring
    Réponses: 7
    Dernier message: 01/05/2010, 17h16
  2. Réponses: 4
    Dernier message: 14/10/2005, 14h02
  3. [Delphi 2005] Comment parcourir la liste des fichiers ?
    Par babyface dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2005, 11h01
  4. comment faire un controle de transaction ???
    Par Oxygene dans le forum Oracle
    Réponses: 4
    Dernier message: 22/02/2005, 15h04
  5. comment faire pour developper des prog en win32
    Par rhodan51 dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 09/11/2003, 19h39

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