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 :

[D7] [Firebird] [FIBPlus] Plusieurs instances fenêtre + DataModule provoque erreur DeadLock


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 45
    Points : 34
    Points
    34
    Par défaut [D7] [Firebird] [FIBPlus] Plusieurs instances fenêtre + DataModule provoque erreur DeadLock
    Bonjour,

    Je travaille sous Delphi 7 avec les composants FIBPlus 6.8 + EHLib pour accéder à une DB Firebird 2.1.

    Voici mon problème :

    - Je dois creer dynamiquement plusieurs instances d'une fenêtre permettant chacune de creer/modifier un enregistrement sur plusieurs tables.
    - Chaque instance crée dynamiquement son propre DataModule.
    - Chaque instance crée/modifie des enregistrements différents.

    Lorsque je crée une première instance de la fenêtre tout se passe bien.

    Lorsque je crée une deuxième instance, les choses se corsent:
    - La première instance qui crée ou modifie les enregistrements (toujours un par table) n'a pas de problèmes.
    - Si l'autre instance crée ou modifie d'autres enregistrements (sur les mêmes tables), je reçois un DeadLock lors de l'édition de l'enregistrement de deux tables (toujours les mêmes). Or ces enregistrements ne sont pas en cours de modification ailleurs.


    J'ai cherché dans tous les sens, et je ne trouve rien d'anormal, surtout que pour les autres tables, celà fonctionne et que les propriétés de toutes les tables (TpFIBDataset) ont les mêmes valeurs.

    Comme les instances des fenêtres et du DataModule sont crées dynamiquement, j'ai essayé de mettre leur propriété Name:='' (ce qui est conseillé) et aussi de leur donner un nom aléatoire, ca ne change rien.

    J'ai aussi essayé de placer un TpFIBDatabase dans le datamodule pour faire une connexion à la DB différente pour chaque instance (en aillant déjà une connexion établie au lancement de l'application).
    Mais apparament on ne peut pas avoir plusieurs connexion à une même DB dans une application car quand je veux préparer les requêtes pour les tables, je reçois l'exception suivante : ...EFIBClientError avec le message ':Transaction is active'.
    Si j'essaye de fermer le programme, je reçois une exception lors de la déconnexion de la première connexion à la DB : EFIBInterbaseError avec le message 'DMMain.FDB: ...Cannot disconnect database with open transactions (1 active).', alors que cette transaction devrait passer par la connexion se trouvant dans le datamodule.

    Si quelqu'un à une idée de la raison pour laquelle la partie en gras ne fonctionne pas, je suis preneur, surtout que ce fait 3 jours que je cherche et je n'ai plus d'idées.

    Merci beaucoup.

    Ah oui... Petit détail qui a peut-être son importance :

    Pour chaque table, lors de la création d'un nouveau record j'ai le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With Datamodule.FIBDataset do
      begin
         Append;
         FIBDatasetID.AsString:=GetID;
         Post; (pour éviter possibilité doublons du ID)
         Edit; => 1ere instance OK, 2eme instance provoque exception DeadLock  seulement pour 2 tables.
      end;
    Chaque table est en AutoCommit.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 45
    Points : 34
    Points
    34
    Par défaut
    La solution est :

    J'avais omis de déterminer une clé primaire sur les deux tables qui me posaient problème.
    => lors de la modification d'un record, c'est toute la table qui est verrouillée.

    Et il m'a fallu une semaine pour trouver ca.

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

Discussions similaires

  1. Plusieurs instances d'un DataModule
    Par PickEpique dans le forum Bases de données
    Réponses: 2
    Dernier message: 03/06/2008, 17h46
  2. plusieurs instances de Firebird sur le même PC
    Par Davboc dans le forum Installation
    Réponses: 6
    Dernier message: 20/03/2007, 09h30
  3. Réponses: 3
    Dernier message: 16/10/2003, 10h22
  4. Communiquer entre plusieurs instances d'applications
    Par bourinator dans le forum C++Builder
    Réponses: 5
    Dernier message: 28/09/2003, 11h24
  5. [] plusieurs instances de form avec leur contexte ?
    Par Seb-31 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 11/04/2003, 13h56

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