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

Oracle Discussion :

[ora - 04020] deadlock detected while trying


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 27
    Points
    27
    Par défaut [ora - 04020] deadlock detected while trying
    Bonjour à tous!

    J'ai un traitement de données qui s'exécute tout les jours. En général, il n'y a aucun problème mais de temps en temps (environ une fois tous les 3 mois) j'ai l'erreur [ora - 04020] deadlock detected while trying.
    Cette erreur ne se produit pas forcément au même endroit du traitement mais à chaque sur la même procédure. La procédure permet d'activer et de désactiver toutes les clefs de la base.
    Si j'ai bien compris, les deadlock se produisent en général lorsque 2 sessions tentent d'accéder à la même ressource. Or dans mon cas il n'y a qu'un user.
    Est-ce que cela provient du code de la procédure? (mais ca devrait arriver à chaque foi) ou est-ce que c'est quelque chose qui arrivera toujours une fois de temps en temps sans qu'on y puisse rien? ou autre chose??

    Voici le code du package
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    CREATE OR REPLACE package body SPA_DATA.PA_SPA as
       procedure P_SPA_ACTIVATE_FK (PTABLENAME varchar2,PMODE varchar2) as
       /******************************************************************************
          NAME:       P_SPA_ACTIVATE_FK
          PURPOSE:    Fonction permettant d'activer ou de desactiver les contraintes
                      portant sur une table
     
          REVISIONS:
          Ver        Date        Author           Description
          ---------  ----------  ---------------  ------------------------------------
          1.0        02/08/2007  FBE              Creation
     
          NOTES:
             ptablename:  Nom de la table devant etre isolée des contraintes de clés
       	              étrangeres
       	  pmode: A pour activer les contraintes portant sur la table
       	         D pour desactiver les contraintes portant sur la table
     
       ******************************************************************************/
          CURSOR c
          IS
             SELECT uc.constraint_name, uc.constraint_type, uc.table_name
               FROM user_constraints uc,
                    (SELECT constraint_name, constraint_type
                       FROM user_constraints
                      WHERE table_name = PTABLENAME AND constraint_type = 'P') table_c
              WHERE uc.r_constraint_name = table_c.constraint_name
                AND uc.table_name not like '%GLD%'
                AND uc.constraint_type = 'R';
     
          vsql_string   VARCHAR2 (2000);
          vmode         VARCHAR2 (10);
       BEGIN
          CASE pmode
             WHEN 'D'
             THEN
                vmode := 'DISABLE';
             WHEN 'A'
             THEN
                vmode := 'ENABLE';
          END CASE;
     
          FOR v_c IN c
          LOOP
             vsql_string :=
                   'ALTER TABLE '
                || v_c.table_name
                || ' '
                || vmode
                || ' CONSTRAINT '
                || v_c.constraint_name;
     
             EXECUTE IMMEDIATE vsql_string;
          END LOOP;
     
          COMMIT;
       END p_spa_activate_fk;
       procedure P_SPA_ACTIVATE_GEN_FK (PMODE varchar2) as
       CURSOR C IS
       SELECT TABLE_NAME
       FROM USER_TABLES WHERE TABLE_NAME NOT LIKE 'TT%' ;
     
       BEGIN
     
       FOR V_C IN C LOOP
         -- Appeler la procédure P_SPA_ACTIVATE_FK
         P_SPA_ACTIVATE_FK ( V_C.TABLE_NAME, PMODE );
         DBMS_OUTPUT.PUT_LINE(V_C.TABLE_NAME);
       END LOOP;
       DBMS_OUTPUT.PUT_LINE('Fini');
       COMMIT;
     
       END P_SPA_ACTIVATE_GEN_FK;
    end PA_SPA;
    /

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Les deadlocks ne se produisent pas quand 2 user s'attaquent à la même source, mais quand 2 users ont posé des verrous chacun sur un objet différent, puis veulent tous les 2 poser un verrou sur l'objet de l'autre (Donc chacun attend que l'autre libère le verrou).

    Ta procédure a l'air bonne.
    Le commit après le ALTER ne sert à rien (un ALTER est une opération DDL, donc pas de rollback possible, pas de commit à faire)

    Pour savoir quelles sessions se sont deadlockées, peut être en vérifiant les logs.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    Merci pour la réponde.
    Pour les deadlocks, c est bien ce que j avais compris mais je me suis mal exprimé.

    Je vais essayer de voire les logs.
    Mais ce que je comprend pas c'est qu'il y a qu'une seule sessions quand j'exécute la procédure...donc je vois pas comment il peut y avoir concurrence.

Discussions similaires

  1. Error while trying to create file
    Par inh40 dans le forum Administration
    Réponses: 6
    Dernier message: 22/04/2008, 14h21
  2. Erreur : Error while trying to write to file
    Par WebPac dans le forum Installation
    Réponses: 11
    Dernier message: 19/05/2006, 22h23
  3. [ora - 04020] deadlock detected while trying
    Par mike devimo dans le forum Oracle
    Réponses: 2
    Dernier message: 21/12/2005, 13h24
  4. Réponses: 7
    Dernier message: 23/11/2005, 10h16
  5. Réponses: 3
    Dernier message: 10/12/2004, 09h42

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