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 :

Problème transaction et thread


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut Problème transaction et thread
    Bonjour,

    Delphi 2007
    SQLServer 2005

    Voilà mon problème :

    Je démarre ma transaction lorsque l'utilisateur clic sur le bouton création
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      try
        Fiche_Principal.Database_Gsm.StartTransaction;
      except
        on E:Exception do
        begin
          AfficheSedIncident('CLO85 -> ', E.Message, 0, 0);
          etc.....
    Dans ma transaction j'ai plusieurs phase :
    dont dans ma 1ère phase je créer une table temporaraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    try
        //*************     Teste l'existance des différents comptes     ***************
        with (Query_General) do
        begin
          close;
          sql.clear;
          sql.add('CREATE TABLE ##Temp_Compte');
          sql.add('  (CtoNum char (9),          ');
          sql.add('   CtoLbu char (1),          ');
          sql.add('   CtoTyp char (7))          ');
          if not (prepared) then
          begin
            prepare;
          end;
          execsql;
        end;
      except
        on E:Exception do
        begin
        etc.
    Jusqu'ici aucun problème.Mais dans mon traitement j'ouvre une deuxième form
    qui affiche dans un TDBgrid le contenu de ma requête temporaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ....
     Fiche_ListeCompte := TFiche_ListeCompte.Create(Fiche_Cloture);
        Fiche_ListeCompte.Left := Fiche_Cloture.Left + ((Fiche_Cloture.Width - Fiche_ListeCompte.Width) div 2);
        Fiche_ListeCompte.Top  := Fiche_Cloture.Top + ((Fiche_Cloture.Height - Fiche_ListeCompte.Height) div 2);
        Fiche_ListeCompte.ShowModal;
        Fiche_ListeCompte.Free;
    ...
    Au niveau de mon showmodal j'active ma query (Select * from @@temp_compte). Et là rien ne s'affiche, mon programme se bloque.

    Donc mon souci c'est que lorsque j'ouvre ma 2ème form il créer un nouveau thread et j'ai l'impression que ma transaction ne suit plus (Lors de mes différents tests, lorsque je supprime le StartTransaction le problème est débloqué).

    Pouvez vous m'éclairer car là je suis un peu perdu.

    L'isolation de ma base est en READ_COMMITTED_SNAPSHOT ON.
    A mon avis, je dois avoir un problème de verrou.

    Merçi pour votre aide.
    Vajilo

  2. #2
    Membre émérite Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Par défaut
    Dois-je comprendre qu'une table temporaire est créée et que dans la foulée une requête est faite dessus dans une même transaction.

  3. #3
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut
    Citation Envoyé par chaplin Voir le message
    Dois-je comprendre qu'une table temporaire est créée et que dans la foulée une requête est faite dessus dans une même transaction.
    Bonjour,

    Pour résumé j'ai 2 form :
    Dans ma 1ère form :
    - je lance ma transaction
    - ensuite, création de matable temporaire
    - Insertion des élèments dans matable temporaire
    - ensuite je fais un select count(*) de ma table temporaire
    - si le count(*) est > 0 alors

    J'ouvre ma 2ème form (Utilisation d'un Tdatasource et d'un Tquery) :
    - select de ma table temporaire pour l'afficher dans un dbgrid. Mais ne s'affiche pas. erreur de verrous

    J'ai un problème de verrous , car dés que j'enlève le starttransaction ma table temporaire s'affiche bien.

    Ce que je ne comprends pas dans ma 1ère form je peux faire autant de select sur ma table temporaire : il répond bien. mais dans ma 2ème form j'ai une erreur de verrous.

    La seul chose qui différe ma 1ère form de ma 2ème c'est que je ne suis pas le même Thread. (Je ne sais pas comment faire pour rester dans le même Thread).

    J'ai fais des ALLOW_SNAPSHOT_ISOLATION ON et READ_COMMITED_SNAPSHOT ON mais sans succés.

    Je suis en pleine migration : on passe de Delphi7 à delphi 2007 et d'informix à SQLServer 2005.

    Mon appli fonctionnait trés bien avant, mais là je ne trouve pas de solution

    Merci pour votre aide.
    Valoji.

  4. #4
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Tu utilises quels composants pour accéder à la base ?

    ADO en particulier a la facheuse tendance à ouvrir une deuxième connexion à la base si tu essaies d'exécuter une deuxième requête sans avoir fermé la première.

    Autrement dit, si tu appels la deuxième form alors que la requête du select count(*) est toujours ouverte, tu as de grande chances pour qu'ADO ouvre une deuxième connexion pour la deuxième form. Et dans ce cas, la table est verrouillée par la transaction dans la première connexion.

    Tu peux d'ailleurs avoir ce comportement avec toute API qui ne prend pas en charge le MARS (Multiple Active RecordSet) indroduit par SQL Server 2005.

    Pour savoir si tu es dans ce cas de figure, tu peux lancer l'analyseur de performances de SQL Server (SQL Server Profiler). Il te permettra de voir les requêtes exécutées par ton application, ainsi que les ouvertures de connexion.

    J'ai déjà rencontré des problèmes, où ADO m'ouvrait une deuxième connexion... pour effectuer le commit de la transaction...

  5. #5
    Membre confirmé Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Par défaut
    J'utilise les connexions BDE. j'ai trouvé une solution intermediaire en envoyant directement un begin transaction via une requête SQL, sans passer par un Database.StartTransaction.

    Vu tes remarques, le BDE doit réagir comme l'ADO.

    Pour savoir si tu es dans ce cas de figure, tu peux lancer l'analyseur de performances de SQL Server (SQL Server Profiler). Il te permettra de voir les requêtes exécutées par ton application, ainsi que les ouvertures de connexion.
    Peut tu me dire si l'analyseur se trouve dans la version de SQL server 2005 Version gratuit, car je ne l'ai pas trouvé.

    Merci pour votre aide
    Valoji.

  6. #6
    Membre émérite Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Par défaut
    Pourquoi crées-tu une table temporaire de façon dynamique ?
    Je le fairais en deux temps, d'abord la création de la table dans une
    transaction, le reste dans une transaction.

  7. #7
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Citation Envoyé par valoji Voir le message
    Peut tu me dire si l'analyseur se trouve dans la version de SQL server 2005 Version gratuit, car je ne l'ai pas trouvé.
    Non, le profiler SQL n'est pas disponible sur les versions Express de SQL Server.

    Et le BDE ouvre effectivement également plusieurs connexions sur la base de données. Mais ça dépend encore de quelle façon tu utilises le BDE ? Avec la DB-Lib (BDE + SQL Links) ou BDE + ODBC.
    Du temps où j'utilisais la DB-Lib, le BDE ouvrait facilement une dixaine de connexions par utilisateur...

    Par contre, même sans le profiler SQL, tu peux avoir une idée des connexions ouvertes sur le server à un instant t :
    Lorsque ton application est bloquée (table temporaire créé et tentative d'ouverture de la deuxième form), tu peux lancer la commande suivante dans SQL Management Studio Express :
    Tu verras alors toutes les connexions ouvertes, ainsi que les process qui bloquent les autres.

Discussions similaires

  1. problème sur les threads et les sémaphores
    Par ramislebob dans le forum Windows
    Réponses: 1
    Dernier message: 29/06/2006, 11h52
  2. [C#] Problème sur un Thread
    Par bisounux dans le forum Windows Forms
    Réponses: 7
    Dernier message: 27/04/2006, 20h43
  3. Problème dans un thread
    Par BNS dans le forum MFC
    Réponses: 3
    Dernier message: 23/03/2006, 14h21
  4. problème Transact SQL
    Par elderion dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/03/2006, 10h09
  5. Réponses: 5
    Dernier message: 10/05/2005, 10h22

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