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

Administration Oracle Discussion :

Lecture d'un deadlock [9iR2]


Sujet :

Administration Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 73
    Points : 47
    Points
    47
    Par défaut Lecture d'un deadlock
    Bonjour,

    J'aurai besoin d'une petite aide, j'ai obtenu un deadlock pour un traitement et j'ai eu deux fois la même requête qui ressort.
    Je l'ai signalé donc aux développeurs, de ne plus faire tourner le traitement plusieurs fois en même temps afin d'éviter ce problème.

    Le deadlock graph est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Deadlock graph:
                           ---------Blocker(s)--------  ---------Waiter(s)---------
    Resource Name          process session holds waits  process session holds waits
    TXblabla                   33      56     X             37      52           S
    TXblabla2                  37      52     X             33      56           S
    Mais en parallèle, j'ai regardé l'objet bloqué à l'aide de ces requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    => select dbms_rowid.rowid_object('XXX') from dual;
    999
    => select object_name from all_objects where object_id = 999;
    TableX
    Il en ressort qu'il s'agit de la table TableX qui est bloquante qui n'a rien à voir avec la requête exécuté.
    La requête exécuté est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    => insert into TableY (a,b,c) values (a,b,c);
    Merci pour votre aide.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    La TableY aurait-elle une contrainte d'intégrité référançant la TableX ?
    Auquel cas, une insertion dans Y pose en effet des verrous sur X afin de valider cette contrainte...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Merci pour le coup de pouce, je n'y avais pas pensé, mais ce n'est pas ça.
    Les tables X et Y n'ont qu'une seule contrainte qui est leurs clés primaires.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Bonjour,

    Citation Envoyé par skyarnangel Voir le message
    Bonjour,

    Le deadlock graph est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Deadlock graph:
                           ---------Blocker(s)--------  ---------Waiter(s)---------
    Resource Name          process session holds waits  process session holds waits
    TXblabla                   33      56     X             37      52           S
    TXblabla2                  37      52     X             33      56           S
    Vous avez deux Transaction Enqueues (TX) prises sur un mode X et attente sur un mode S(Share). Il y a deux possibilités dans ce cas qui peuvent résulter d'un pareil deadlock graph

    1. Existence d'un ou de plusieurs Bitmap indexes dans votre application (sur vos tables en deadlock au moins)
    2. Primary key ou unique key overlapping

    La partie du deadlock graph qui suit (ce que vous avez déjà posté) montre les SQL en conflit. Vous avez déjà identifié un insert. Il faut voir alors le deuxième SQL. Si c'est également un insert alors je pencherai plutôt pour une primary key/unique key overlapping. Sinon c'est la présence d'un bitmap indexe

    https://hourim.wordpress.com/2011/03...-bitmap-index/

    Pour votre information il ne peut y avoir un deadlock du à une Foreign key non indexée sans la présence d'au moins un TM enqueue dans le deadlock graph
    Bien à vous
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Merci pour votre aide, mais je n'ai pas pu profiter de votre lien, on m'indique une adresse introuvable ?

    Les sessions qui ont provoqués le deadlock montrent la même requête, j'en ai conclu que le programme a été lancé 2 fois en même temps et est entré en conflits.

    J'ai vérifié, et il n'y a pas de bitmap index sur mes tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select distinct INDEX_TYPE from user_indexes where table_name in ('TABLEX', 'TABLEY');
     
    INDEX_TYPE
    ---------------------------
    NORMAL
    Je pense que le problème se situe sur la deuxième option.

    Mais, ma question vient sur le fait que l'objet bloqué est la table X alors que les requêtes font une insertion sur la table Y.

    J'espérai m'être trompé lorsque j'ai posté mes requêtes qui interrogent les tables contenant les rowid ou quelque chose comme ça, mais ça ne semble choquer personne.

    Serait il possible que les requêtes SQL qui sortent dans le fichier traces ne soient pas celles à l'origine du deadlock ?

  6. #6
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par skyarnangel Voir le message
    Bonjour,
    Serait il possible que les requêtes SQL qui sortent dans le fichier traces ne soient pas celles à l'origine du deadlock ?
    Elles font forcément partie du deadlock.

    Ce que par contre, ne vous dit pas le deadlock graph, c'est qu'il est possible que vous ayez plusieurs autres objets impliqués dans le deadlock mais qui n'apparaissent pas dans le deadlock graph.

    Est-ce que vous pouvez poster la partie qui contient les deux sql et particulièrement la partie Rows waited on:

    Bien à vous
    Mohamed Houri
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Voici ce que vous m'avez demandé :

    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
     
    DEADLOCK DETECTED
    Current SQL statement for this session:
    insert into TABLEY(a,b,c) values (a1,b1,c1)
    The following deadlock is not an ORACLE error. It is a
    deadlock due to user error in the design of an application
    or from issuing incorrect ad-hoc SQL. The following
    information may aid in determining the deadlock:
    Deadlock graph:
                           ---------Blocker(s)--------  ---------Waiter(s)---------
    Resource Name          process session holds waits  process session holds waits
    TX-AAA                   33      53     X             37      51           S
    TX-AAA                   37      51     X             33      53           S
     
    session 53: DID 0001-0021-000000C1	session 51: DID 0001-0025-00000060
    session 51: DID 0001-0025-00000060	session 53: DID 0001-0021-000000C1
     
    Rows waited on:
    Session 51: obj - rowid = 99X99X9X - XXpoxeXXXAAAAAAAA
      (dictionary objn - 999, file - 10, block - 0, slot - 0)
    Session 53: obj - rowid = 99X99X9X - XXpoxeXXXAAAAAAAA
      (dictionary objn - 999, file - 10, block - 0, slot - 0)
    Information on the OTHER waiting sessions:
    Session 51:
      pid=99 serial=9999 audsid=9999 user: 99/USER
      O/S info: user: user, term: , ospid: 999999, machine: hostname
                program: blabla@hostname (TNS V1-V3)
      application name: blabla@hostname (TNS V1-V3), hash value=0
      Current SQL Statement:
     
    insert into TABLEY(a,b,c) values (a1,b1,c1)
    End of information on OTHER waiting sessions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select dbms_rowid.rowid_object('XXpoxeXXXAAAAAAAA') from dual;
                                         999
     
    select object_name from all_objects where object_id = 999;
    TABLEX
    J'ai anonymisé les données mais grossomodo c'est ça.

    Merci pour le coup de pouce

  8. #8
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    TableX et TableY sont dans un même cluster ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Je suis pas sure de la définition de cluster...

    J'ai pu comprendre qu'il s'agit d'une information sur la répartitions des informations, les tables sont sur le même tablespace, probalement dans des datafiles différents mais sur la même machine, il ne sont pas spécialement "rangé".

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par skyarnangel Voir le message
    Bonjour,

    Voici ce que vous m'avez demandé :

    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
    DEADLOCK DETECTED
    Current SQL statement for this session:
    insert into TABLEY(a,b,c) values (a1,b1,c1)
    The following deadlock is not an ORACLE error. It is a
    deadlock due to user error in the design of an application
    or from issuing incorrect ad-hoc SQL. The following
    information may aid in determining the deadlock:
    Deadlock graph:
                           ---------Blocker(s)--------  ---------Waiter(s)---------
    Resource Name          process session holds waits  process session holds waits
    TX-AAA                   33      53     X             37      51           S
    TX-AAA                   37      51     X             33      53           S
    
    session 53: DID 0001-0021-000000C1	session 51: DID 0001-0025-00000060
    session 51: DID 0001-0025-00000060	session 53: DID 0001-0021-000000C1
    
    Rows waited on:
    Session 51: obj - rowid = 99X99X9X - XXpoxeXXXAAAAAAAA
      (dictionary objn - 999, file - 10, block - 0, slot - 0)
    Session 53: obj - rowid = 99X99X9X - XXpoxeXXXAAAAAAAA
      (dictionary objn - 999, file - 10, block - 0, slot - 0)
    Information on the OTHER waiting sessions:
    Session 51:
      pid=99 serial=9999 audsid=9999 user: 99/USER
      O/S info: user: user, term: , ospid: 999999, machine: hostname
                program: blabla@hostname (TNS V1-V3)
      application name: blabla@hostname (TNS V1-V3), hash value=0
      Current SQL Statement:
      
    insert into TABLEY(a,b,c) values (a1,b1,c1)
    End of information on OTHER waiting sessions.
    Selon Jonathan Lewis la présence de slot -0 est une indication (possible pas tout le temps vraie) que le rowid en question n'a rien à voir les objets impliqués dans le deadlock. Ce n'est en réalité que ce qu'il y avait dans v$session.row_wait_obj# avant que le deadlock n'ait lieu

    http://jonathanlewis.wordpress.com/2.../13/deadlocks/
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  11. #11
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    L'information du rowid n'est pas toujours fiable.
    La requête en attend, elle, l'est: c'est bien l'insert qui est en attente. Est-ce qu'il n'y aurait pas 2 insert qui essaieraient d'insérer la même valeur de clé?
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 73
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    Oui, je pense qu'il s'agit bien du problème, la double insertion.
    Comme je le dit, mon problème était le rowid remonté qui ne semble n'avoir rien à voir avec le problème.

    Mais vous dites que le rowid n'est pas forcément pertinent, ce qui du coup explique mon fichier trace.

    Merci pour le coup de main, je vais passer la discussion en résolu.

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

Discussions similaires

  1. [ADO] Sauvegarde / lecture de recordset
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/09/2002, 16h54
  2. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43
  3. Pb Lecture de bitmap monochrome
    Par Loïc38 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/07/2002, 18h24
  4. Lecture d'une image bitmap
    Par Geronimo dans le forum x86 32-bits / 64-bits
    Réponses: 18
    Dernier message: 28/06/2002, 12h01
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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