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 :

Voir une requête qui lock


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 39
    Points
    39
    Par défaut Voir une requête qui lock
    Bonjour,
    J'ai un application .NET attaquant une base Oracle 10g qui a tendance à produire des locks dans certains cas particulier que je n'arrive pas à définir.
    Avec les requêtes que j'ai pu trouver sur ce forum j'arrive à identifier la session qui lock et celle qui attend.
    Pour la session en attente, je suis capable de récupérer la requête en cours via la column SQL_ID de la table V$SESSION, par contre pour la session qui bloque, le champ SQL_ID est vide.

    Exemple Simple pour illustrer :
    Si je fais un update sur une la première ligne d'une table avec la session 1 mais que je ne commit pas. Et que je tente ensuite avec la session 2 de faire un update sur cette même ligne, j'obtiens un lock tant que je ne commit pas la session 1.
    Avec la table V$SESSION et le champ SQL_ID je peux effectivement retrouver la requête en attente pour la session 2 par contre je n'arrive pas à trouver la requête de la session 1.

    Y a-t-il une possiblité de récupérer cette requête? Sinon peut-on éventuellement savoir quels objets sont lockés?

    Ces problèmes se produisant uniquement en production (dû notamment à la densité du trafic) il n'est donc pas envisageable de tracer la session.

    Le but final est d'identifier avec précision les requêtes incriminés.

    Merci d'avance.

  2. #2
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Dans mon chapeau magique, j'ai retrouvé çà pour tracer les locks

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select sid, serial#,username, program, terminal from v$session;
    select * from v$lock;
    select * from v$locked_object;
    select * from v$open_cursor where user_name=myuser;
    select * from dba_waiters;
    select * from dba_blockers;
    en espérant que cela puisse t'aider
    PpPool

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    la FAQ et la page Source montre aussi des requêtes intéressantes

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 62
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par orafrance Voir le message
    la FAQ et la page Source montre aussi des requêtes intéressantes
    Dans la FAQ je n'ai trouvé que ceci : Comment détecter les verrous (locks) ?

    Pas contre je n'ai rien trouvé de plus dans la page Source, as-tu un exemple que j'aurais raté?

    Citation Envoyé par PpPool Voir le message
    Dans mon chapeau magique, j'ai retrouvé çà pour tracer les locks

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select sid, serial#,username, program, terminal from v$session;
    select * from v$lock;
    select * from v$locked_object;
    select * from v$open_cursor where user_name=myuser;
    select * from dba_waiters;
    select * from dba_blockers;
    en espérant que cela puisse t'aider
    Merci Ppool, la table v$open_cursor semble garder les dernières requêtes effectuées par la session si j'ai bien compris.
    Théoriquement ma requête qui lock doit être une de celle-là, mais peut-on savoir exactement laquelle est la dernière à avoir été exécuté?

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    http://oracle.developpez.com/sources...eau1#lst_locks

    pour la dernière c'est pas possible, au mieux tu as celle en cours et ça a déjà du être traité dans ce forum

  6. #6
    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
    J'avias déjà fait des recherches pour ça. Ce n'est pas possible de connaitre exactement quelle requete à créé le lock.
    Tu peux toujours retrouver la table, le block, la ligne lockée, la session qui locke.
    A partir de là rechercher dans les requetes des sessions celle(s) qui correspond à ça.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    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
    Points : 3 597
    Points
    3 597
    Par défaut
    Avec les éléments suivants, il doit être facile de retrouver les requêtes qui verrouillent des lignes d'une table:

    • Une ligne est verrouillée en mode exclusif par SELECT FOR UPDATE, INSERT, UPDATE ou DELETE.
    • Un SELECT sans clause for UPDATE ne verrouille pas de ligne.
    • Les verrous ne sont libérés qu'au COMMIT et au ROLLBACK.


    Lorsqu'il y a un ou plusieurs verrou(s) exclusif(s) sur 1 ou plusieurs lignes d'une même table, il y un (et un seul) verrou de type TX dans V$LOCK. Voir le début de la discussion AskTom avec un exemple complet.

Discussions similaires

  1. [SQL] une requête qui ne s'arrête pas ou si loin
    Par lodan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/10/2006, 14h36
  2. Réponses: 8
    Dernier message: 26/01/2006, 14h47
  3. une requête qui selectionne la ligne max
    Par kuhnden dans le forum Access
    Réponses: 3
    Dernier message: 01/11/2005, 18h39
  4. Une requête qui ne reconnait pas is not null
    Par LeBauw dans le forum Access
    Réponses: 2
    Dernier message: 08/09/2005, 12h29
  5. [...] doit utiliser une requête qui peut être mise à jour
    Par requiemforadream dans le forum ASP
    Réponses: 4
    Dernier message: 26/04/2005, 09h12

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