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 :

Invalid transaction handle (expecting explicit transaction start)


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut Invalid transaction handle (expecting explicit transaction start)
    Bonjour tout le monde.
    J'utilisais les composants dbXpress pour me connecter à Firebird, j'ai changé et suis passé aux composants IB natifs Firebird/Interbase.

    J'ai plusieurs bases de données Firebird (2 en fait), je fait des rappatriements de données, dans un premier temps de la première base de données vers la seconde, puis de la seconde vers la seconde.
    Et lorsque j'essaie d'ouvrir la seconde requête (pour le second rappatriement), j'ai ce message d'erreur :
    invalid transaction handle (expecting explicit transaction start).
    J'ai regardé l'état connecté des bases de données, si mes transactions sont actives et normalement, c'est bon de ce côté là.

    Savez-vous ce que signifie ce message d'erreur ? Afin de pouvoir mieux orienter mes recherches.
    Pour le sujet, j'ai limité mes explications à 2 bases de données, mais mon code doit fonctionner pour un nombre non limité de bases de données.

    J'ai peur de ne pas faire les bonnes affectations entre les transactions, les bases de données et les requêtes, ce que je fais, c'est chaque transaction est affectée à une unique base de données (une transaction pour la source et une pour la destination). Et chaque base de données possède sa transaction.
    Exemple pour la source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
              ibTransactionSource.RemoveDatabases;
              ibTransactionSource.AddDatabase( ibSource.Database );
              ibSource.Database.AddTransaction( ibTransactionSource );
    Si la base de données source est la même que la base de données destination, elle possède 2 transactions. C'est bien ainsi qu'il faut faire ?

    Merci pour votre aide.

  2. #2
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Je me demande si cela ne vient pas du fait que je mets 2 transactions sur la même base de données, la première pour faire une requête du type SELECT et la seconde pour faire une requête du type INSERT.
    Je pense que je dois continuer à utiliser la transaction pour faire l'INSERT, mais je me demande si je suis obligé d'utiliser une transaction pour faire le SELECT, je vais essayer de la supprimer pour voir si ça fonctionne ou pas.
    En faisant ainsi, je me retrouve avec une transaction unique pour sur la base destination et la requête qui fait l'INSERT.

  3. #3
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    En supprimant la transaction source, un truc bizarre est arrivé.
    J'ai la transaction de ma requête source qui est la même que la transaction de la requête destination, ce sont des références sur la même instance de transaction.

    C'est très bizarre, je vais donc revenir à 2 transactions et continuer à chercher quel peut être le problème.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Si la transaction Select permet de renseigner la transaction Insert, il faut que cela soit fait dans une même transaction.
    Car, qui te dit qu'entre ton Select et l'Insert quelqu'un ne modifiera pas un des enregistements ?

    Sinon pour ton erreur du 1er message, je pense que tu dois faire un commit ou un rollback alors que tu n'as pas commencé de transaction. (c'est ce à quoi me fait penser ce message)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    A priori, il n'y a que mon programme qui peut accéder et modifier les enregistrements de la base de données destination.
    Mis à part cela, je doute pouvoir faire les 2 requêtes dans la même transaction car la base de données source peut ne pas être de type Firebird et dans ce cas, j'utilise les composants dbXpress, TSQLConnection, TSQLQuery,...
    Ainsi, je dois faire un code source et un code destination séparés.
    D'ailleurs pour compliquer la tâche, la destination n'est pas forcément non plus du type Firebird, mais dans ce cas là, ça fonctionne, je ne demande qu'avec Firebird en destination.

    En fait, j'ai le message d'erreur lorsque j'essaie d'ouvrir une requête du type SELECT.

    En continuant dans mes recherches, je crois que cela vient du fait qu'avant toute manipulation, je réinitialise toutes les transactions de la base de données destination.
    Je faisais une réinitialisation considérant que partir à plat puis faire les affectations était plus simple et plus propre, hors on dirait que ça pose problème.

  6. #6
    Membre éclairé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Par défaut
    Ce que je ne comprends pas par exemple, si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ibTransactionDest.DefaultDatabase := DatabaseDest;
    DatabaseDest.AddTransaction( ibTransactionDest );
    ShowMessage( IntToStr( DatabaseDest.TransactionCount ) );
    ou si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ibTransactionDest.DefaultDatabase := DatabaseDest;
    ShowMessage( IntToStr( DatabaseDest.TransactionCount ) );
    J'obtiens le même nombre : 2.
    Finallement, on n'a pas besoin d'affecter les transactions dans les composants Database, suffit d'affecter les bases dans les composants Transaction ?

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

Discussions similaires

  1. Fonctionnement - Open transaction et Journal de transaction
    Par Oishiiii dans le forum Administration
    Réponses: 2
    Dernier message: 20/06/2015, 18h19
  2. OpenProcess renvoie Invalid Process Handle
    Par ktsys dans le forum C++
    Réponses: 2
    Dernier message: 31/07/2007, 12h07
  3. [Transaction] comment faire une transaction ?
    Par adil_vpb dans le forum Requêtes
    Réponses: 2
    Dernier message: 31/05/2007, 15h14
  4. Réponses: 2
    Dernier message: 23/05/2007, 11h02
  5. [Hibernate] Transaction not successfully started
    Par ypoupou dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/05/2006, 10h36

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