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 :

Informations sur les transactions, commit et rollback AIDE ?


Sujet :

Connexion aux bases de données Firebird

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut Informations sur les transactions, commit et rollback AIDE ?
    Bonjour,

    C'est encore moi, je voudrais avoir dans la mesure du possible des informations complémentaires sur les transactions (startTransaction, commit, rollback etc...) en fait je début avec Interbase/Firebird (moins d'un mois)

    En effet dans mon programme, je créé dynamiquement le composant Tibtransaction comme indiquer ci-dessous :
    Je créer ce composant ou cette connexion lorsque que je démarre l'application.
    My_DATABASE:=TIBDataBase.create(Nil);
    My_DATABASE.DatabaseName := PTR_WORK_QUERY.REPERTOIRE_BDD;
    My_DATABASE.SQLDialect := 3;
    My_DATABASE.Params.Clear;
    My_DATABASE.Params.Add('user_name=SYSDBA');
    My_DATABASE.Params.Add('password=masterkey');
    My_DATABASE.LoginPrompt := false;
    My_DATABASE.Connected := true;

    MY_SESSION_TRANSACTION:=TIBTransaction.create(Nil);
    MY_SESSION_TRANSACTION.DefaultDatabase := My_DATABASE;
    MY_SESSION_TRANSACTION.StartTransaction;
    MY_SESSION_TRANSACTION.CheckInTransaction;
    ensuite lors que je veux faire une SELECT ou un UPDATE ,INSERT etc.. je créer dynamiquement mon IBQUERY:

    Database:= My_DATABASE ;
    Transaction := MY_SESSION_TRANSACTION;
    Close;
    SQL.Clear;
    SQL.Add(SQLTXT);
    EXECSQL
    Lorsque toutes mes mises à jour sont (MAJ de toutes les tables OK) je fait un commit:
    MY_SESSION_TRANSACTION.Commit;
    Puis le je détruit mon IBQUERY à la fin de toutes les transactions:
    FreeAndNil(self);

    Et c'est là que j'ai le problème, lorsqu'un autre exe lit la base de données.

    • Si l'EXE-2 s'est connecté avant le mise à jour de l'EXE-1 ==> Il (EXE-2) ne lit pas le MAJ sauf si je ferme EXE-2 et je redemmarre l'EXE-2
    • Si l'EXE-2 s'est connecté après la mise à jour de l'EXE-1 ==> il (EXE-2) lit bien la nouvelle donnée.


    Pouvez-vous m'aider à y voir plus clair ?

    je pense que que cela à pour origine le mode de connexion ou l'appel à la transaction.

    Pensez vous que je doive faire comme suit:

    My_DATABASE:=TIBDataBase.create(Nil);
    My_DATABASE.DatabaseName := PTR_WORK_QUERY.REPERTOIRE_BDD;
    My_DATABASE.SQLDialect := 3;
    My_DATABASE.Params.Clear;
    My_DATABASE.Params.Add('user_name=SYSDBA');
    My_DATABASE.Params.Add('password=masterkey');
    My_DATABASE.LoginPrompt := false;
    My_DATABASE.Connected := true;

    MY_SESSION_TRANSACTION:=TIBTransaction.create(Nil);
    MY_SESSION_TRANSACTION.DefaultDatabase := My_DATABASE;
    ensuite lors que je veux faire une SELECT ou un UPDATE ,INSERT etc.. je créer dynamiquement mon IBQUERY:

    MY_SESSION_TRANSACTION.StartTransaction;
    MY_SESSION_TRANSACTION.CheckInTransaction
    ;
    Database:= My_DATABASE ;
    Transaction := MY_SESSION_TRANSACTION;
    Close;
    SQL.Clear;
    SQL.Add(SQLTXT);
    EXECSQL
    Lorsque toutes mes mises à jour sont (MAJ de toutes les tables OK) je fait un commit:
    MY_SESSION_TRANSACTION.Commit;
    Puis le je détruit mon IBQUERY à la fin de toutes les transactions:
    FreeAndNil(self);

    Cordialement
    QAYS.

  2. #2
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    certes, mais tu ne nous dis pas quel type d'isolement de transaction tu utilises,
    ni dans quelle type de transaction tu es pour lire tes données,
    je t'invite à lire cet article :
    http://www.firebird-fr.eu.org/articl...?id_article=39

    et ceci :
    http://interbase.developpez.com/faq/?page=transaction

    pour mieux comprendre les transactions et leurs différents niveau d'isolement, c'est à dire comment déterminer ce qu'une transaction peux voir ou pas du travail des autres transactions
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    merci de cette reponse.

    en fait je ne sais pas comment coder le mode d'isolement est ce ainsi ?:
    MY_SESSION_TRANSACTION.DefautlAction:= TaCommitRetainning
    ou
    MY_SESSION_TRANSACTION.CommitRetainnig
    ou
    ?????
    Pour rappel je créé "dynamiquement" le TibTransaction et TIBDataBase lorsque je démarre l'appli c'est à dire une seule fois, et je pense que le problème vient de là.
    My_DATABASE:=TIBDataBase.create(Nil);
    My_DATABASE.DatabaseName := PTR_WORK_QUERY.REPERTOIRE_BDD;
    My_DATABASE.SQLDialect := 3;
    My_DATABASE.Params.Clear;
    My_DATABASE.Params.Add('user_name=SYSDBA');
    My_DATABASE.Params.Add('password=masterkey');
    My_DATABASE.LoginPrompt := false;
    My_DATABASE.Connected := true;

    MY_SESSION_TRANSACTION:=TIBTransaction.create(Nil);
    MY_SESSION_TRANSACTION.DefaultDatabase := My_DATABASE;
    MY_SESSION_TRANSACTION.StartTransaction;
    MY_SESSION_TRANSACTION.CheckInTransaction;
    En suite à chaque fois que je questionne ou que je mets à jour la bdd
    je créé dynamiquement le QUERY c'est a dire

    EN LECTURE
    ----------------

    Database:= My_DATABASE ;
    Transaction := MY_SESSION_TRANSACTION;
    Close;
    SQL.Clear;
    SQL.Add(SQLTXT);
    OPEN
    mes actions (init écrans, calcul etc...)
    FREEANDNIL
    EN ECRITURE
    ----------------

    Database:= My_DATABASE ;
    Transaction := MY_SESSION_TRANSACTION;
    Close;
    SQL.Clear;
    SQL.Add(SQLTXT);
    EXECSQL
    Puis un COMMIT à la fin
    et enfin un FREEANDNIL
    Aujourd'hui tout ce passe comme si lors de la connexion la IBtransaction ou le IBdatatbase prenait une photo de la base de données et tant que je ne redemarre pas, les maj des autres exe ne sont pas visible.


    Pour info j'ai essyer plusieurs trucs et aucun résultat satisfaisant
    Dans l'attente d'une reponse
    Cordialement
    QAYS

  4. #4
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    pour coder ton isolement voir la doc de ton outil de dev

    si non effectivement, il faut une transaction par ensemble d'opérations dont on veut assurer la cohérence, pas une seule transaction par appli
    tu peux n'avoir qu'un seul composant, ce n'est pas un probleme
    mais tu démarres et ferme ta transaction pour chaque ensemble d'opérations cohérentes
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    bonjour,

    c'est l'un d'es trucs que j'ai essayé et cela marche bien pour le mise a jour, le problème c'est l exe-2 qui lui à (comme je ai dit dans mon message précedent) à "pris une photo" de la base lors de sa connexion et donc même si l'exe-1 a fait le commit et que la maj en ok en bdd (si je lance l'exe-3 ,de dernier voit la mise a jour) l exe-2 lui ne voit pas cette donne

    je vais essayer autre chose ce matin

    pour info j'utilise delphi 7 pro.

  6. #6
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    ce que tu ne comprend pas c'est que c'est vrai pour tous les dialogues avec le serveur, y compris les simples SELECT
    si tu associes tes SELECT avec une seule transaction à l'ouverture de l'appli, il n'y a que si tu choisis READCOMMITED que tu verras les actions commitées par les autres transaction (ça c'est le comportement (mauvais en général) du BDE)
    car cela laisse ouverte une transaction pendant tout le temps que ton exe est lancé
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    merci de ton aide, je te remerci bcp de ton aide, je viens de faire le test et cela semble être ok, en effet en creant une nouvelle transaction je retrouve bien mes petits

    toutefois je continue les tests.

    envore une fois merci

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Août 2004
    Messages
    696
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 696
    Points : 225
    Points
    225
    Par défaut
    Bingo, tout est ok,

    en fait je creé dynamiquement une transaction à chaque questionnement ou mas de la bdd et une fois le travail effectué (init ecran, calcul etc...) je détruis le transaction.

    avec ce mode opératoire je n'ai aucun problème, je retrouve tous mes petits

    Par contre maitenant je vais faire un test de monté en charge et voir combien de connextion sont possibles en simultanné

    encore une fois merci
    Cordialement
    KQAYS

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

Discussions similaires

  1. Informations sur les langages/outils de ce forum
    Par Idelways dans le forum Autres langages
    Réponses: 3
    Dernier message: 14/02/2018, 12h08
  2. petite aide sur les transactions et triggers SVP
    Par CharleLéo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2004, 20h43
  3. information sur les ps
    Par devalender dans le forum Débuter
    Réponses: 4
    Dernier message: 20/07/2004, 10h07
  4. Réponses: 6
    Dernier message: 28/04/2004, 10h41
  5. Informations sur les procédures stockées
    Par jfphan dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/01/2004, 14h30

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