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 :

[9i] paramètre dml_locks


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 226
    Par défaut [9i] paramètre dml_locks
    Bonjour,

    J'ai une base avec beaucoup d'utilisateur et le log de l'application remonte souvent des erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-00054: resource busy and acquire with NOWAIT specified
    J'ai regardé le fichier d'initialisation de ma base et j'ai vu le paramètre : dml_locks qui a pour valeur 100 ce qui est considéré comme SMALL par ORACLE, est ce que ces erreurs peuvent avoir un lien avec ce paramètre ?
    Si oui comment evaluer la valeur a lui attribuer.

    Cordialement

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Par défaut
    Bonjour , cela n'a aucun rapport
    les locks interviennent lorsqu'une autre personne que vous utilise déja le segments et que vous souhaitez faire une opération qui est NOWAIT ( qui n'attend pas )

    Je vous donne un exemple :

    je crée un table et pose un verrou sur toute la table :
    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
    SQL> create table dvp ( a number ) ; 
     
    Table créée.
     
    SQL> create index dvp_ind on dvp (a) ;
     
    Index créé.
     
    SQL> insert into dvp values (1) ; 
     
    1 ligne créée.
     
    SQL> insert into dvp values (2) ; 
     
    1 ligne créée.
     
    SQL> commit ;
     
    Validation effectuée.
     
    SQL> update dvp set a= 3 ;
     
    2 ligne(s) mise(s) à jour.
    dans une autre session je fais une requête NOWAIT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL> alter index dvp_ind rebuild   ; 
    alter index dvp_ind rebuild
    *
    ERREUR à la ligne 1 :
    ORA-00054: Ressource occupée et acquisition avec NOWAIT (pas d'attente)
    indiquée
    quelques solutions :
    - Soit je recommence plus tard
    - Soit je libére la ressource
    - LOCK TABLE IN EXCLUSIVE MODE.

    N'oublions pas que ces opérations ont besoin d'avoir un accés en mode exclusive

    Ci joint une requête qui va vous permettre de voir les locks :

    Le DML_LOCKS est un paramétre qui va définir le nombre maximale de verrou sur un objet ( forcément de type partagé ), moi pour ma part 100 ce n'est pas un faible nombre.

    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
    77
    SELECT   /*+ choose */ 
             bs.username "Blocking User", 
             bs.username "DB User", 
             ws.username "Waiting User", 
             bs.sid "SID", 
             ws.sid "WSID", 
             bs.sql_address "address", 
             bs.sql_hash_value "Sql hash", 
             bs.program "Blocking App", 
             ws.program "Waiting App", 
             bs.machine "Blocking Machine", 
             ws.machine "Waiting Machine", 
             bs.osuser "Blocking OS User", 
             ws.osuser "Waiting OS User", 
             bs.serial# "Serial#", 
             DECODE ( 
                wk.TYPE, 
                'MR', 'Media Recovery', 
                'RT', 'Redo Thread', 
                'UN', 'USER Name', 
                'TX', 'Transaction', 
                'TM', 'DML', 
                'UL', 'PL/SQL USER LOCK', 
                'DX', 'Distributed Xaction', 
                'CF', 'Control FILE', 
                'IS', 'Instance State', 
                'FS', 'FILE SET', 
                'IR', 'Instance Recovery', 
                'ST', 'Disk SPACE Transaction', 
                'TS', 'Temp Segment', 
                'IV', 'Library Cache Invalidation', 
                'LS', 'LOG START OR Switch', 
                'RW', 'ROW Wait', 
                'SQ', 'Sequence Number', 
                'TE', 'Extend TABLE', 
                'TT', 'Temp TABLE', 
                wk.TYPE 
             ) lock_type, 
             DECODE ( 
                hk.lmode, 
                0, 'None', 
                1, 'NULL', 
                2, 'ROW-S (SS)', 
                3, 'ROW-X (SX)', 
                4, 'SHARE', 
                5, 'S/ROW-X (SSX)', 
                6, 'EXCLUSIVE', 
                TO_CHAR (hk.lmode) 
             ) mode_held, 
             DECODE ( 
                wk.request, 
                0, 'None', 
                1, 'NULL', 
                2, 'ROW-S (SS)', 
                3, 'ROW-X (SX)', 
                4, 'SHARE', 
                5, 'S/ROW-X (SSX)', 
                6, 'EXCLUSIVE', 
                TO_CHAR (wk.request) 
             ) mode_requested, 
           object_name , 
             TO_CHAR (hk.id1) lock_id1, 
             TO_CHAR (hk.id2) lock_id2 
    FROM     v$lock hk, v$session bs, v$lock wk, v$session ws ,  V$LOCKED_OBJECT a , 
    dba_objects b 
    WHERE    hk.BLOCK = 1 
    AND      hk.lmode != 0 
    AND      hk.lmode != 1 
    AND      wk.request != 0 
    AND      wk.TYPE(+) = hk.TYPE 
    AND      wk.id1(+) = hk.id1 
    AND      wk.id2(+) = hk.id2 
    AND      hk.sid = bs.sid(+) 
    AND      wk.sid = ws.sid(+) 
    AND      a.object_id=b.object_id 
    AND      hk.sid=a.session_id 
    ORDER BY 1;

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    226
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 226
    Par défaut
    merci pour toutes ces précisions :

    Peut tu m'en dire plus sur le : "LOCK TABLE IN EXCLUSIVE MODE"

    merci d'avance

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Par défaut
    Alala que ne dois pas faire pour ces membres

    Tu vas locké la table entiére en mode exclusive qui est le mode le plus
    restrictif chez Oracle. Et indiqué ainsi aux autres session que la table est locké et donc toutes les opérations en NOWAIT


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL> create table dvp ( a number ) ; 
     
    Table créée.
     
    SQL> LOCK TABLE DVP IN EXCLUSIVE MODE ;
     
    Table(s) verrouillée(s).
    Pour toi cela cette opération ne se terminer pas en erreur, elle va attendre
    jusqu'a ce que la table soit délocké et ferat ensuite son lock ce qui va
    permettre a tes autres opérations de pouvoir continuer tranquillement.


    Ici on a une petite requête qui va nous permettre de voir le type de lock ;

    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
    SQL> col object_name format a20
    SQL> set linesize 250
    SQL> r
      1  select os_user_name ,process ,  object_name , DECODE (
      2              hk.lmode,
      3              0, 'None',
      4              1, 'NULL',
      5              2, 'ROW-S (SS)',
      6              3, 'ROW-X (SX)',
      7              4, 'SHARE',
      8              5, 'S/ROW-X (SSX)',
      9              6, 'EXCLUSIVE',
     10              TO_CHAR (hk.lmode)
     11           )  from V$LOCKED_OBJECT a,
     12   dba_objects b , v$lock hk
     13   where b.object_id = a.object_id
     14*  and hk.sid=a.session_id
     
    OS_USER_NAME                   PROCESS      OBJECT_NAME         
     DECODE(HK.LMODE,0,'NONE',1,'NULL',2,'ROW
    ------------------------------ ------------ -------------------- 
    -----------------------------------
    jzouaghi                       1340:284     DVP                  EXCLUSIVE
     
     
    SQL>
    Le mode exclusif s'enléve avec le commit ou le Rollback

  5. #5
    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
    Petite précision:

    Le paramètre DML_LOCK correspond au nombre maximum de verrous que l'on peut poser sur l'ensemble des tables concernées par un INSERT, UPDATE et DELETE à un instant donné dans l'instance. (Cela n'a rien à voir avec le nombre de lignes dans qu'on peut verrouiller dans les tables concernées qui lui est théoriquement illimité.)

    Voir:
    http://download-uk.oracle.com/docs/c...57.htm#1016850

  6. #6
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Par défaut
    Citation Envoyé par pifor
    Petite précision:

    Le paramètre DML_LOCK correspond au nombre maximum de verrous que l'on peut poser sur l'ensemble des tables concernées par un INSERT, UPDATE et DELETE à un instant donné dans l'instance.


    Le DML_LOCKS est un paramétre qui va définir le nombre maximale de verrou sur un objet

    ici il faut comprendre nbr maximale de verrou sur un Objet ( contrairement à verrou sur un block buffer par exemple ) , evidement cela concerne toute l'instance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bon je vais essayer d'être simple :
    Par fpouget dans le forum Langage SQL
    Réponses: 8
    Dernier message: 09/04/2003, 17h46
  2. question (peut-être idiote) sur les vues
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/03/2003, 10h35
  3. {$PARAM} dans XMLGRAM
    Par rgarnier dans le forum XMLRAD
    Réponses: 3
    Dernier message: 31/01/2003, 12h42
  4. Comment être sure que mon appli prenne le focus ?
    Par AmaX dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/12/2002, 15h00
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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