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

SQL Oracle Discussion :

Exception Table vérrouillée


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Par défaut Exception Table vérrouillée
    Bonjour,

    voila en fait j'ai créé un web service dont l'une des fonctions (asynchrones) utilisent la fonction d'un package. Cette fonction travail sur une table. Elle verrouille la table, fait un traitement, puis libère la table.

    Mon probleme est que plusieurs applications utilisent le web service. Donc si la table est vérrouillée par une des applications.

    Ce que je voudrais c'est que la premiere appli pose le verrou et en fait que les autres attendent leur tour.

    J'ai donc penser à récuperer l'exception de la fonction du package et a boucler tant qu'on la. Ca donnerait un truc de ce genre là.

    dans la package:

    function sql (parametre)
    return number is

    lock table A in exclusive mode;

    // traitrement

    commit;

    return 1


    EXCEPTION
    WHEN others THEN
    RETURN 0;
    END;

    et dans la fonction du web service (en VB dotnet)

    dim i as integer=0

    do while i=0
    i=executer sql(parametre)
    loop
    Le probleme est que si l'exception concerne autre chose que l'éventuel verrouillage de la table, je vais boucler a l'infini.

    Bref si quelqu"un connaissait quelque chose de plus propre .... (voir comment traiter directement une l'exception liée a une table verrouillée)

    Merci.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Il faut d'abord associer le n° d'erreur exact du message d'erreur Oracle (ORA-00054) à une exception PL/SQL avec l'instruction pragma_init (voir exemple dans le tutoriel PL/SQL) et ensuite récupérer explicitement cette exception.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Par défaut
    merci pour cette explication. Comment puis-je faire alors pour faire en sorte que le processus attende que la table se libere.

    function sql (x in varchar2)
    return number is

    lock table T in exclusive mode;

    //exemple

    update T set quantite=0 where id=x;

    Exception
    When exceptionCrée then
    sql(x)
    end;
    un appel récursif dans la gestion des exceptions est-il possible ??

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Vous pouvez, par exemple, créer une fonction "chapeau" qui appelle votre fonction et qui attend dans une boucle en utilisant DBMS_LOCK.SLEEP. Pour cela il faut que votre fonction retourne un code retour signifiant soit "fonction exécutée" ou "attente sur verrou". Il faut aussi penser à sortir au bout d'un nombre maximal d'itérations pour éviter une boucle infinie en cas de bug

    Ceci dit, est-il bien nécessaire de verrouiller une table en mode exclusif pour un traitement ? Par défaut, Oracle prendra un verrou exclusif sur chaque ligne concernée par un INSERT, UPDATE et DELETE et ne prendra pas de verrou pour un SELECT simple (Oracle prendra un verrou exclusif avec un SELECT ... FOR UPDATE).

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Par défaut
    Je vous remerci pour votre aide.

    Si je ne lock pas ca plante.En fait il y a plusieurs type de traitement sur une même table (insert, select, truncate ....).

    Pour le dbms_lock, elle n'est pas reconnue. Peut etre parce que nos bases ne sont pas encore en 10G.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Il faut probablement qu'un DBA donne le droit d'execution sur le package DBMS_LOCK.

    Il faudrait préciser votre version d'Oracle et les messages d'erreur précis que vous avez.

  7. #7
    Membre chevronné Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Par défaut
    Pour commencer je suis tout a fait d'accord avec pifor. Je ne vois pas pourquoi poser un lock manuellement. Dans l'immense majorité des cas Oracle se débrouille très bien tout seul.


    Sinon pourquoi as tu besoin de gérer une exception ? Essaye de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Lock table T in exclusive mode;
    dans un session et la même commande dans une autre session. Tu verras que la deuxième session attends que la première ai soit fait un commit soit un rollback sans que tu ais besoin de gérer une exception avec une boucle etc...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2007
    Messages : 15
    Par défaut
    En gros le web service execute deux foncitons:

    1. insertion de données dans une table temporaire TEMP ( réalisée de facon synchrone)

    2. lancement d'une fonction traitement_ (asynchrone)

    -> la fonction retourne un code_erreur concernant l'insertion des données.

    La fonction traitement_ réalise les choses suivantes:

    1. truncates de table de travail
    2. insertion des données depuis la table temporaire vers les tables de travail
    3. truncate de la table temporaire.
    4. traitement des tables de travail

    l'idée est que la fonction traitement_ boucle tant que la table temp n'est pas vide. C'est a dire que si une autre session insert des données dans la table temporaire, c'est la première session qui traite les données.

    J'ai une fonction de test. Si je lance un seul webservice ca marche. Si j'en lance 2 avec un Thread.Sleep(10000) et sans lock, j'ai une fenetre Visual studio Just-in-time debuger qui s'affiche avec le message suivant:

    an unhandled exception .....( '...DBAcess.DBAcessException') ....
    Peut-etre que cela est indépendant de l'accés concurrentiel. Peut etre que c'est juste lié au fait que c'est la même fonciton test qui lance les webs services.

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/09/2007, 17h28
  2. SHOW TABLES avec exception
    Par jiojioforever dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/03/2007, 09h33
  3. purger une table d'exception
    Par cesoir dans le forum Oracle
    Réponses: 2
    Dernier message: 23/06/2006, 20h29
  4. Réponses: 1
    Dernier message: 10/06/2006, 01h31
  5. [MySQL] [Requete] Soustraction de 2 tables (EXCEPT)
    Par joxbl dans le forum Langage SQL
    Réponses: 9
    Dernier message: 09/05/2006, 13h53

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