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 :

Les transactions avec TIBDatabase et TIBSQL


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 84
    Points : 67
    Points
    67
    Par défaut Les transactions avec TIBDatabase et TIBSQL
    Bonjour,

    Dans mon formulaire , j'ai un composant TIBDatabase et un composant TIBSQL qui sont associés á un même composant TIBTransaction.

    Le composant TIBDatabase alimente un TDBGrid avec le contenu d'une table et le composant TIBSQL me sert à faire des insertions sur cette même table. Le SGBD utilisé est Firebird.

    Les transactions du composant TIBDatabase sont gérées automatiquement alors que pour le composant TIBSQL, j'initie et ferme mes transactions selon le modèle ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FRM_Login.OuvrirTransaction(IBSQL_cadastro.Transaction);
    try 
        IBSQL_cadastro.SQL.Clear; 
        IBSQL_cadastro.SQL.Append('insert into CATEGORIAS (CAT_ID, CAT_NOME, CAT_DTCAD) '); 
        IBSQL_cadastro.SQL.Append('select max(CAT_ID)+1, :nome, cast(''TODAY'' AS DATE) from CATEGORIAS'); 
        IBSQL_cadastro.ParamByName('nome').AsString := Edit_novaCat.Text;     
        IBSQL_cadastro.ExecQuery; 
        IBSQL_cadastro.Close; 
        IBSQL_cadastro.Transaction.Commit; 
    except on E: Exception do IBSQL_cadastro.Transaction.Rollback;
    end;
    Le pb est le suivant :

    Je modifie un champs dans le TDBGrid (TIBDatabase) et ensuite je fais une insertion (TIBSQL).
    Si l'insertion génére une erreur, cela exécute un Rollback. Jusqu'ici tout va bien mais le problème est que le Rollback de la transition du TIBSQL supprime la modification que j'ai faite dans le TDBGridet qui est dans la transaction du TIBDatabase.

    N'y a-t-il pas un moyen de contrôler toutes les transactions 100% par le code et non pas par les composants ?

    Cyril.

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Citation Envoyé par cgone
    Si l'insertion génére une erreur, cela exécute un Rollback. Jusqu'ici tout va bien mais le problème est que le Rollback de la transition du TIBSQL supprime la modification que j'ai faite dans le TDBGridet qui est dans la transaction du TIBDatabase.
    Tout ceci est parfaitement logique ! Les modifications effectuées sur ton DBGrid et les insertions effectuées avec ton IBSQL font parties de la même transaction. Si tu fais un Rollback lors d'un échec d'insertion (ce qui doit être fait), il est normal que tes modifs fassent également parties du Rollback.

    Si tu veux plus de contrôle la solution est de définir une transaction pour le DataSet du DBGrid et une pour le IBSQL. Comme cela tu peux faire un Commit ou un Rollback après une insertion sans interférer sur les modifs faites avec ton DBGrid.

    @+ Claudius

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 84
    Points : 67
    Points
    67
    Par défaut
    Salut,

    Je pensais que le composant TIBTransaction gérait plusieurs transactions et chacune dans un thread différent...

    Du même coup cela signifie alors que chaque composant qui accède au SGBD doit avoir sa propre transaction.

    Cependant, quand j'utilise un TIBDataSet, un TDBGRID et un TDBNavigator, comment je fais pour gérer manuellent les transactions car les requêtes sont dans les SelectSQL, RefreshSQL, InsertSQL, ModifySQL ou DeleteSQL et donc je n'ai aucun code pour le faire comme c'est le cas avec un TIBSQL.
    Finallement, on ne sait jamais quand le TIBDataSet ouvre et ferme une transaction car le problème initial a montré qu'après avoir utilisé une de ses 5 requêtes (ModifySQL dans le cas présent), la transaction n'est pas "commitée" puisque le Rollback déclenché par la requête du TIBSQL avait aussi annulé la requête du ModifySQL.

    Cyril

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,

    Ton TIBDataSet est relié à ta transaction. Cette transaction englobe toutes les modifications effectuées par tes requêtes ModifySQL, InsertSQL et DeleteSQL (et également SelectSQL et RefreshSQL pour les requêtes Select, car tout est transaction avec IB/FB).

    Tu n'as pas de moyen d'affecter une transaction différente à chacune de ces requêtes.

    De deux choses l'une: ou tu valides/annules (Commit/Rollback) à la fermeture de ton IBDataSet, ou bien tu CommitRetaining/RollbackRetaining après un Post ou un delete (OnAfterPost, OnAfterDelete).

    Mais dans les deux cas ta transaction sera active dès l'ouverture du TIBDataSet jusqu'à sa fermeture.

    @+

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par cgone
    Finallement, on ne sait jamais quand le TIBDataSet ouvre et ferme une transaction car le problème initial a montré qu'après avoir utilisé une de ses 5 requêtes (ModifySQL dans le cas présent), la transaction n'est pas "commitée" puisque le Rollback déclenché par la requête du TIBSQL avait aussi annulé la requête du ModifySQL.
    Combiner un TIBDataSet combiné avec TIBSQL comme tu le fais, ne me semble pas une bonne idée.

    Limite toi à un TIBDataSet.

    @+

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 84
    Points : 67
    Points
    67
    Par défaut
    Salut,

    Ton TIBDataSet est relié à ta transaction. Cette transaction englobe toutes les modifications effectuées par tes requêtes ModifySQL, InsertSQL et DeleteSQL (et également SelectSQL et RefreshSQL pour les requêtes Select, car tout est transaction avec IB/FB).

    Tu n'as pas de moyen d'affecter une transaction différente à chacune de ces requêtes.
    Je ne veux pas affecter une transaction différente à chacune des requêtes ModifySQL, InsertSQL et DeleteSQL, SelectSQL et RefreshSQL, je voudrais qu'elle "commite" á chaque fois qu'elles sont utilisées.

    Cyril

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Tu ne peux pas, tu ne fera qu'un seul commit/rollback pour l'ensemble des requêtes.

    Ou bien un CommitRetaining/RollbackRetaining à chaque Post ou Delete.

    @+

Discussions similaires

  1. Comment utiliser les transactions avec UIB
    Par zoheir13 dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 13/01/2011, 09h51
  2. [MySQL] Faire fonctionner les transaction avec AdoDB
    Par halimux dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/11/2010, 17h14
  3. gérer les transactions avec php/sql server
    Par loukili81 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/05/2007, 17h39
  4. Où gérer les transactions avec Firebird ?
    Par DMO dans le forum Débuter
    Réponses: 2
    Dernier message: 26/04/2005, 09h21
  5. Les transactions avec Delphi & InterBase
    Par Redhouane dans le forum Bases de données
    Réponses: 5
    Dernier message: 31/12/2004, 15h34

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