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

Interfaces de programmation Oracle Discussion :

Verifier verrouillage d'une table


Sujet :

Interfaces de programmation Oracle

  1. #1
    Candidat au Club
    Homme Profil pro
    Apprenti Ingenieur
    Inscrit en
    mai 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Ingenieur

    Informations forums :
    Inscription : mai 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Verifier verrouillage d'une table
    Bonjour, j'ai un problème assez urgent a résoudre, après beaucoup de recherche je n'ai toujours pas trouvé de solution, je sollicite donc votre aide.

    Mon problème est simple je dois vérifier si une table est verrouillé, j'ai donc essayé ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $req="SELECT  *  from TABLE where ... for update nowait";
    $stid=oci_parse($conn,$req);
    if(!@oci_execute($stid)){
    	$message="Erreur : Enregistrement la table TABLE verouille";
    }
    le problème c'est quand faisant cela je verrouille la table alors que je veux juste vérifier si elle l'est ou non.
    D'avance merci.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    décembre 2002
    Messages
    3 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : décembre 2002
    Messages : 3 428
    Points : 7 863
    Points
    7 863
    Par défaut
    Vous pouvez tout simplement utiliser V$LOCKED_OBJECT, en jointure avec DBA_OBJECTS sur OBJECT_ID.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  3. #3
    Candidat au Club
    Homme Profil pro
    Apprenti Ingenieur
    Inscrit en
    mai 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Ingenieur

    Informations forums :
    Inscription : mai 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Alors, je n'ai pas très bien compris, vous pourriez être un peu plus précis ?
    J'ai oublié de préciser également que je ne dois pas vérifier si la Table est verrouillée entièrement mais seulement les lignes qui m’intéresse.
    en tout cas j'ai testé cette requette :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT XIDUSN,OBJECT_ID,SESSION_ID,ORACLE_USERNAME,OS_USER_NAME,PROCESS from v$locked_object
    et j'obtiens l'erreur suivante:
    ORA-00942: Table ou vue inexistante

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    décembre 2002
    Messages
    3 428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : décembre 2002
    Messages : 3 428
    Points : 7 863
    Points
    7 863
    Par défaut
    L'erreur ORA-00942 signifie soit que la table indiquée n'existe pas, soit que vous n'avez pas les droits pour y accéder.
    Et en effet, la vue V$LOCKED_OBJECT n'est pas accessible à n'importe qui, et il faut donc demander les droits à votre DBA.

    Mais pouvez-vous détailler le besoin fonctionnel qui vous pousse à rechercher si une ligne est verrouillée ?
    Que ferez-vous de cette information ?
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  5. #5
    Candidat au Club
    Homme Profil pro
    Apprenti Ingenieur
    Inscrit en
    mai 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Ingenieur

    Informations forums :
    Inscription : mai 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je dois vérifier si un enregistrement de ma table n'est pas déjà verrouillé, si oui j'affiche un message d'erreur sinon je verrouiller a mon tour pour ensuite faire une série d’opération a partir de cette ligne.
    Le but étant j'imagine que la ligne ne sois pas modifiée par un autre utilisateur pendant que d'autres opérations sont en cours sur cette ligne.

  6. #6
    Candidat au Club
    Homme Profil pro
    Apprenti Ingenieur
    Inscrit en
    mai 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Ingenieur

    Informations forums :
    Inscription : mai 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Personne ? c'est assez urgent ! :/

  7. #7
    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
    Citation Envoyé par mDaud Voir le message
    Personne ? c'est assez urgent ! :/
    Je risque de me répéter mais si c'est urgente appelez le supporte Oracle c'est leur job!

    La logique de votre demande peut/devrait être légèrement changée: je demande le verrouillage d'un enregistrement via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select Null 
    From Table 
    Where... 
    For Update Nowait
    Si l'enregistrement est déjà verrouillé alors l'exception 00054 sera levée et cette exception peut être interceptée ce qui permet d'afficher un message. Sinon l'enregistrement a été verrouiller et je peux poursuivre mon traitement.

  8. #8
    Candidat au Club
    Homme Profil pro
    Apprenti Ingenieur
    Inscrit en
    mai 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Apprenti Ingenieur

    Informations forums :
    Inscription : mai 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Alors d'abord merci pour votre réponse mais je suis toujours bloqué, j'ai essayé ceci en guise de test:

    Ici on verouille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $req="SELECT  *  from TAB where ... for update Nowait ";
    $stid=oci_parse($conn,$req);
    oci_execute($stid);
    Ensuite je fais quelque requetes

    Puis je test si verouillé: (normalement oui)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $req="SELECT  NULL  from TAB where ... for update Nowait ";
     $stid=oci_parse($conn,$req);
    if(!@oci_execute($stid)){
    	echo "Erreur 2 : Enregistrement dans la table TAB verouille";
    }
    Or ici l'erreur ne s'affiche pas
    En faisant ceci par contre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $req="SELECT  * from TAB where ... for update Nowait ";
     $stid=oci_parse($conn,$req);
    if(!@oci_execute($stid)){
    	echo "Erreur 2 : Enregistrement dans la table TAB verouille";
    }
    Le message d'erreur s'affiche me disant que la table est vérouillé mais par contre si elle ne l'est pas elle le devient donc toujours le même problème.

  9. #9
    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
    Vous n'avez pas encore compris. Quand vous exécuter select ... for update nowait si le verrouillage réussie il n'y a aucune erreur. Par contre si le verrouillage échoué parce qu'une autre session détienne déjà des verrous sur le même enregistrement une erreur spécifique est levée. Vous devez donc tester que cette erreur spécifique est arrivée sinon vous risquée d'en ajouter à la confusion comme vous le faite avec votre exemple "Select NULL..." vers "Select *...".

    En conclusion pour votre protocole de test:
    1. commencez par verrouiller votre table dans une autre session via un select for update ou lock table ... in exclusive mode
    2. lancez votre programme qui exécute Select for update. L'erreur ORA-00054 doit être levée.
    3. relâcher le verrou dans la première session via rollback.
    4. relancez votre programme qui exécute Select for update. Aucune d'erreur ne devrait être levée.


    Et assez importante encore: quand votre programme rencontre une erreur suite à l'exécution du oci_exec interceptez et affichez le code d'erreur pour comprendre sa nature.

Discussions similaires

  1. Verifier l'existance d'une table
    Par kmaniche dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/12/2006, 15h56
  2. verifier si une table contient une colonne
    Par da_latifa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/07/2006, 15h19
  3. Vérifier l'existance d'une colonne dans une table MySQL
    Par )3lade dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 18/04/2006, 11h46
  4. [JBDC] Verifie qu une table contien une cle
    Par harris_macken dans le forum JDBC
    Réponses: 7
    Dernier message: 11/07/2005, 16h24
  5. comment verifier l'appartenance a une table?
    Par raul83 dans le forum Access
    Réponses: 7
    Dernier message: 11/10/2004, 16h07

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