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

PL/SQL Oracle Discussion :

probléme accés concurent


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut probléme accés concurent
    Salut
    Je suis entrain de developper une application desktop java multi-thread.
    j'ai une table utilisé pour stocké un valeur utilisé comme séquences.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     CREATE TABLE "MESSAGE_SEQUENCE" 
       (	
    	"VALEUR_SEQ" NUMBER(20,0), 
    	"BLOCAGE" NUMBER(1,0) DEFAULT 0
       ) ;
    • La colonne VALEUR_SEQ contient la valeur de la séquence

    • La colonne BLOCAGE contient 0 ou 1,le premier thread qui execute une procedure met la valeur à 1 pour empêcher les autre threads d'accéder simultanément à la table.une fois il a recupérer la valeur VALEUR_SEQ , il augmente VALEUR_SEQ et rend BLOCAGE à 0.

    cette table est utilisé par plusieurs procédures stockés utilisé par mon application:voici le code qui permet de recupérer la valeur VALEUR_SEQ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    LOOP
    	BEGIN
                SELECT BLOCAGE INTO BLOCAGE FROM MESSAGE_SEQ  FOR UPDATE of BLOCAGE;
    	   IF BLOCAGE =0 THEN
    	   	UPDATE  MESSAGE_SEQ SET BLOCAGE= 1 ;
    	   	SELECT VALEUR_SEQ + 1 INTO V_COD_MES_INT FROM MESSAGE_SEQ ;
    	  	UPDATE  MESSAGE_SEQ SET VALEUR_SEQ= VALEUR_SEQ + 1; 
    	  	UPDATE  MESSAGE_SEQ SET BLOCAGE= 0 ;
           		EXIT;
    	   END if;
    D'abord tout marche bien mais aprés repéter les tests plusieurs fois,une erreur apparaît; en fait ,parfois la valeur de BLOCAGE se bloque à la valeur 1 empêchant ainsi tous les threads d'accéder au code!
    pourquoi cette erreur est comment résoudre ce probléme?

  2. #2
    Invité
    Invité(e)
    Par défaut
    As-tu impérativement besoin d'avoir une séquence avec une suite de nombre concomitant (sans trou dans la suite)? Sinon utilise une séquence Oracle, ça t'évitera de réinventer la roue.
    http://fadace.developpez.com/oracle/sequences/

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par 7gyY9w1ZY6ySRgPeaefZ Voir le message
    As-tu impérativement besoin d'avoir une séquence avec une suite de nombre concomitant (sans trou dans la suite)? Sinon utilise une séquence Oracle, ça t'évitera de réinventer la roue.
    http://fadace.developpez.com/oracle/sequences/
    Merci pour la réponse.
    Mais mon problème est que je doit utilisé la base donnée existante.
    Je doit résoudre le problème avec la table MESSAGE_SEQ.
    Je n'ai pas compris pourquoi ces erreurs de blocage,non féquentes, se posent,est ce qu'il y a une erreur dans mon code ou est ce que il y une amélioration que je puisse faire?

  4. #4
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    BLOCAGE ne sert à rien, le verrou sur l'enregistrement suffit à sérialiser l'accès à MESSAGE_SEQ.
    Tout ce code pourrait être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE  MESSAGE_SEQ SET VALEUR_SEQ= VALEUR_SEQ + 1 RETURNING VALEUR_SEQ into V_COD_MES_INT;
    parfois la valeur de BLOCAGE se bloque à la valeur 1
    Comment as-tu pu voir celà ? la valeur 1 n'est jamais commitée ?

    D'ailleurs, quand est-ce que se fait le commit ? Si c'est à la fin, alors à quoi sert de faire du multi-thread si tous les threads sont sérialisés sur une seule ressource ?

    Et la seule solution pour avoir un numéro de sequence, avec une concurrence d'accès, c'est une sequence.
    Je doit résoudre le problème avec la table MESSAGE_SEQ.
    Pourquoi ? C'est pour un pari ? alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT sequence.NEXTVAL from MESSAGE_SEQ;



    Cordialement,
    Franck.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    686
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 686
    Par défaut
    Citation Envoyé par pachot Voir le message
    Bonjour,

    Comment as-tu pu voir celà ? la valeur 1 n'est jamais commitée ?
    Désolé pour oubliez le commit, c'était une simple faute de copiage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE  MESSAGE_SEQ SET BLOCAGE= 0 ;commit;
    à quoi sert de faire du multi-thread si tous les threads sont sérialisés sur une seule ressource ?
    Pour bien clarifier les choses,mon application reçoit plusieurs messages à traiter indépendamment,chaque thread traite un message mais au moment de persistance,chaque thread appele une procedure stocké qui contient le code plsql qui permet de récupérer la valeur de la colonne VALEUR_SEQ(cette valeur servira comme une clé primaire pour les messages).
    Pourquoi ? C'est pour un pari ? alors:
    En fait,il ya d'autre modules qui utilisent la table MESSAGE_SEQ ,c'est pourqu'oi j'ai besoin de travailler avec cette table

Discussions similaires

  1. Problème de concurence d'accès aux données
    Par ruman dans le forum Access
    Réponses: 2
    Dernier message: 20/02/2006, 13h06
  2. (débutant) Problème accès concurrents
    Par lolo... dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/12/2005, 08h49
  3. [Problème] Accès aux propriétés de listes nommées avec []
    Par VincentL dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/10/2005, 16h13
  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