Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Connexion aux bases de données
Connexion aux bases de données Forum d'entraide sur la connectivité Firebird: composants, drivers, transactions, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/09/2006, 10h19   #1
Membre habitué
 
Inscription : août 2004
Messages : 541
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 541
Points : 118
Points : 118
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.
Citation:
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:

Citation:
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:
Citation:
MY_SESSION_TRANSACTION.Commit;
Puis le je détruit mon IBQUERY à la fin de toutes les transactions:
Citation:
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:

Citation:
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:

Citation:
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:
Citation:
MY_SESSION_TRANSACTION.Commit;
Puis le je détruit mon IBQUERY à la fin de toutes les transactions:
Citation:
FreeAndNil(self);

Cordialement
QAYS.
QAYS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 11h04   #2
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 21h57   #3
Membre habitué
 
Inscription : août 2004
Messages : 541
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 541
Points : 118
Points : 118
merci de cette reponse.

en fait je ne sais pas comment coder le mode d'isolement est ce ainsi ?:
Citation:
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à.
Citation:
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
----------------

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

Citation:
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
QAYS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2006, 23h31   #4
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2006, 07h51   #5
Membre habitué
 
Inscription : août 2004
Messages : 541
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 541
Points : 118
Points : 118
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.
QAYS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2006, 11h10   #6
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2006, 12h26   #7
Membre habitué
 
Inscription : août 2004
Messages : 541
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 541
Points : 118
Points : 118
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
QAYS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2006, 13h44   #8
Membre habitué
 
Inscription : août 2004
Messages : 541
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 541
Points : 118
Points : 118
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
QAYS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h58.


 
 
 
 
Partenaires

Hébergement Web