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 :

Pb d'accès concurents et de deadlock


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Par défaut Pb d'accès concurents et de deadlock
    Bonjour

    j'arrives à mettre ma base sur un serveur et à ouvrir plusieurs fois l'appli
    sur la même fiche.

    Mais si je mets a jour la fiche, celle ci reste vérouillé jusqu'à la fin

    pour maj ma table je fais
    que manque t il

    J'ai une transaction que j'active à l'ouverture de l'appli par
    et elle est active jusqu'a ce que je quittes l'appli

    Que faut il faire ?

    Merci.

    [Modération] Sujet déplacé par Laurent Dardenne [/Modération]

  2. #2
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    bonjour,

    le maniement des transactions est toujours délicat. Je ne pense pas que le but d'une transaction soit de durer toute le temps de l'application. La transaction est là pour garantir l'intégrité de la base de données en cas de problème, pour éviter par exemple que lors d'un plantage au beau mileu d'un virement de compte à compte une table soit mise à jour et pas l'autre.
    Maintenant il y a plusieurs niveaux de verouillage pour les transactions, je te conseille un petit tour sur le site SQL PRO dans lequel il y a toute une partie très interessante sur le sujet.

    @++
    Dany

  3. #3
    Membre éclairé Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Par défaut
    petit tour sur le site SQL PRO
    Ou ca ?

    Lorsque j ouvre mmon appli je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaTrans.Active := True;
    et je mets a false à la sortie

    J ai essayé de virer ca et au moment du commit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaTrans.StartTransaction
    MaTrans.CommitRaitaining
    Mais la,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaTrans.StartTransaction
    il plante et me dit Transacion Active
    Comment faire ?

    merci
    [Modération]
    Merci d'utiliser les balises code ou quote, Laurent Dardenne
    [/Modération]

  4. #4
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 12
    Par défaut deadlock
    1) Ne pas avoir en permanence ta transaction active
    2) Bosser avec des requetes plutôt que des tables

    Ca permettra à ton application de moins verrouillés tes données

  6. #6
    Membre éclairé Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Par défaut
    Bosser avec des requetes plutôt que des tables
    Je n ai que des queries avec des requetes

    Ne pas avoir en permanence ta transaction active
    Donc je supprime le MyTrans.Acive := True ??

    mais apres comment faire ?

    a chaque post je dois activer la transaction et faire un CommitRetaining ?

    et comment desactiver la trans ?

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 12
    Par défaut
    Active ta transaction avant chaque groupe fonctionnel de requete

    MyTrans.Active := False pour désactiver

  8. #8
    Membre éclairé Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Par défaut
    Active ta transaction avant chaque groupe fonctionnel de requete
    que veux tu dire ?

    je l active pour la lecture aussi ou uniquement pour les maj dans la base ?

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 12
    Par défaut
    pour chaque action, tu actives et désactives

  10. #10
    Membre éclairé Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Par défaut
    donc ca va donner ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MyTrans.StartTransaction
     
    MonQuery.Open
     
    MyTrans.Active := False
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MyTrans.StartTransaction
     
    MonQuery.Post
     
    MyTrans.CommitRetaining
     
    MyTrans.Active := False
    est ce bien comme ca ?
    [Modération]
    Merci d'utiliser les balises code ou quote, Laurent Dardenne
    [/Modération]

  11. #11
    Membre éclairé Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Par défaut
    Malgré ca, mon enregistrement reste bloqué il faut que je quittes l appli pour que l autre pc puisse y acceder

    n y a t il pas une option dans le select a mettre ?

  12. #12
    Membre chevronné Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Par défaut
    Avant de commencer et STP t'aurais du préciser ton SGBD.
    Dans tout SGBD tout se passe au sein d'une Transaction même un simple select ensuite tes modifications apportées tu dois valider la transaction en cours (qui est déjà active c'est pour ça qu'il se plante )
    donc tu peux vérifier si la transaction n'est pas en cours dans certain cas avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      if not MaTransaction.InTransaction then
        MaTransaction.StartTransaction;
      try
        MaTransaction.Commit; //ou avec Retaining
      except
        MaTransaction.Rollback;
      end;
    Un point crutial dans ta conception des transactions : tu peux choisir leur niveau d'isolement à ce que je vois tu as choisir un niveau qui attend la fin de toutes transactions et c'est un niveau qui n'est pas vraiment pratique tu dois choisir un niveau avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    read_committed
    rec_version
    nowait

  13. #13
    Membre éclairé Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Par défaut
    Oui désolé j ai oublié

    c est Firebird 1.5

    et suis en D7

    as choisir un niveau qui attend la fin de toutes transactions
    je fais ca pour ma transaction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      with IBT_Base.Params do
        begin
          Add('write');
          Add('read_committed');
          Add('no_rec_version');
          Add('nowait');
        end;
    que dois je mettre à la place ?

    merci de l aide apportée

  14. #14
    Membre éclairé Avatar de Cazaux-Moutou-Philippe
    Inscrit en
    Mai 2005
    Messages
    674
    Détails du profil
    Informations personnelles :
    Âge : 75

    Informations forums :
    Inscription : Mai 2005
    Messages : 674
    Par défaut
    Que dois je mettre comme parametres pour ma transaction ?

  15. #15
    Membre chevronné Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Par défaut
    Je pense que le niveau d'isolement de ta transaction est bon.
    Je crois que ton problème reste dans la conception des transactions :
    Lorsque tu veux entamer une opération particulière tu dois avoir une application active donc au tout début tu dois avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaTransaction.Active := True;
    Ensuite tu active tes IBQuery ou tes IBDataSet. Tu fais ce que tu as à faire ensuite si tu as besoin de valider tes modifications tu fais un commit mais tu ne dois pas appeler StartTransaction car elle va activer une fois de plus ta transaction déjà active.
    Un dur Commit désactive la transaction tu auras besoin de la réactiver pour d'autres opérations mais avec un CommitRetaining pas besoin de le faire car ça ne la désactive pas mais il ne fais pas abuser si tu as beacoup de client connectés.
    Si tu veux envoyer un bout de code qui fais une opération particulière tu auras surement des réponses plus directes.

Discussions similaires

  1. Acces concurents sur un fichier
    Par TobyKaos dans le forum Langage
    Réponses: 4
    Dernier message: 06/03/2006, 23h30
  2. Accès concurents sur fichier log
    Par Amnesiak dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2006, 23h00
  3. Accès concurents
    Par Endymion222 dans le forum Oracle
    Réponses: 7
    Dernier message: 15/12/2005, 17h04
  4. Accès concurants
    Par John Fullspeed dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 05/11/2004, 09h38
  5. Accès concurent et ActiveX
    Par nico-pyright(c) dans le forum MFC
    Réponses: 3
    Dernier message: 15/06/2004, 15h44

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