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 :

Verrou Oracle : trouver le verrou d'un enregistrement


Sujet :

Oracle

  1. #1
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 33
    Par défaut Verrou Oracle : trouver le verrou d'un enregistrement
    Bonjour,

    J'utilise les transactions dans une appli client / serveur.

    A l'ouverture d'un enregistrement en mode fiche pour modification je pose un verrou sur l'enregistrement.

    Lorsque un autre user tente d'ouvrir cet enregistrement l'appli tente de le verouiller mais elle ne peut pas parce qu'il est deja verrouiller donc aucune modif ne sera possible sur cet enregistrement.

    L'appli se connecte toujours avec le meme user de BDD les user de l'appli sont geres dans une table, pour avoir @ mail n° tel et d'autres infos sur le user

    Donc qd je regarde la table sys 'v_$locked_object' j vois bien le verrou mais le prob c que s'il y a plusieurs enregistrements differents ouvert il y aura plusieurs verrou alors lorsque je tente d'ouvrir un enre deja verrouiller comme savoir quel verrou l'a verrouillé

    Merci

    En fait je veux juste associer un verrou a un enregistrement

    PS : Je pense ne pas avoir ete clair........

  2. #2
    Membre éclairé

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mars 2003
    Messages
    701
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 701
    Billets dans le blog
    1
    Par défaut
    bonsoir,

    comment verrouilles-tu ton enregistrement ?
    un select for update, un lock de la table ...

    oracle verrouille systématiquement tout enregistrement en modification,
    ( voir la doc pour plus de détails)
    donc ton verrou est peut-être inutile ?

    cdlt

  3. #3
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 33
    Par défaut
    Bonsoir

    En fait je verrouilles mon enreigtrment avec select for update

    donc je demarre une transaction
    je lance select for update

    et en comittant le verrou exclusive disparait (a la fermeture de la fiche)

    tout se passe bien mais le problem c que je voudrait identifier le user qui a poser le verrou sur cet enregistrement lorsuqe un d'autre ouvre l'enre en select for update

    Le truc c que je me connecte toujours avec le meme user a la base de donnees mais je recupere juste l'identification de connection :

    AUDSID

    Les user sont paramtres dans une table et a la connexion je mets a jour un champ de cette table pour connaitre l'identifiant de connexion

    Donc lorsque un user tente d'ouvrir un enre verrouille il faudrait a quel verrou il est associe pour recupere le AUDSID du verrou et savoir quel user l'a verrouille, sinon je peux juste afficher

    l'enregistrement est verrouille par un autre user modif impossible

    Comment associe le verrou a l'enregistrement verrouiller

    Merci

  4. #4
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 33
    Par défaut SVP
    Bonjour,

    Ca fait eux semaines que je galere alors je vai reexpliquer ma demande.

    En fait c tout simple j'ai un poser des verrous sur plusieurs enregistrement d'une table.

    Je voudrais savoir comment trouver le verrou de l'enregistrement ?

    J'ai donc 10 verrous et 10 enregistrements verrouille comment savoir quel verrou et pose que quel enregistrement, sachant tous les utilisateurs se connectent avec le meme user Oracle

    merci

    DeZ

  5. #5
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    merci d'éditer vos messages pour rajouter les balises [ code ] et [ /code ] ! ;-)

    Sinon, jetez un coup d'oeil aux vues v$lock, v$locked_object et éventuellement DBA_WAITERS/DBA_BLOCKERS mais ça dépend des scripts passés ...

  6. #6
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 33
    Par défaut re
    Thx

    Mais j'ai consulter toutes ces tables, voila la requete que j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select *
    from SYS.V_$LOCKED_OBJECT	L,	 	
            SYS.ALL_OBJECTS	A, 	
            SYS.V_$SESSION	S	
    where L.OBJECT_ID 	= A.OBJECT_ID		
    and   S.SID 	= L.SESSION_ID		
    and   L.ORACLE_USERNAME='GP'	
    and   A.OWNER='GP'				
    and   S.USERNAME='GP'			
    and   S.SCHEMANAME='GP'		
    and   A.OBJECT_NAME='P_PARC'
    Et dans le resultat de cette requete j'ai bien dix lignes qui correspondent aux dix enregistrements de diferrents ID verrouilles mais comment dire que l'enregistrement 1 et verrouille par le verrou 1 ou 2.

    J'ai essyer de lie le verrou a l'enregistrement avec le ROWID mais la requte si dessus ne m'indique pas le rowid.

    par contre j'ai des valeurs comme le SADDR ou PADDR ou encore dans la table V_$LOCK j'ai de valeurs ADDR et KADDR puis je retrouver ces valeurs ds la table ou je pose des verrous pour lie l'enregistrement au verrou ?


    Merci

  7. #7
    Membre Expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Par défaut
    Bonjour,

    Peut-on avoir la version Oracle ?

    Ce script montre celui qui bloque
    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
    select 
      s.sid "SID", 
      s.serial# "SER", 
      o.object_name "Table", 
      o.owner, 
      s.osuser "OS User", 
      s.machine "Node", 
      s.terminal "Terminal", 
      --p.spid "SPID", 
      --s.process "CPID", 
      decode (s.lockwait, null, 'Have Lock(s)', 'Waiting for <' || b.sid || '>') "Mode", 
      substr (c.sql_text, 1, 150) "SQL Text" 
    from v$lock l, 
      v$lock d, 
      v$session s, 
      v$session b, 
      v$process p, 
      v$transaction t, 
      sys.dba_objects o, 
      v$open_cursor c 
    where l.sid = s.sid 
      and o.object_id (+) = l.id1 
      and c.hash_value (+) = s.sql_hash_value 
      and c.address (+) = s.sql_address 
      and s.paddr = p.addr 
      and d.kaddr (+) = s.lockwait 
      and d.id2 = t.xidsqn (+) 
      and b.taddr (+) = t.addr 
      and l.type = 'TM' 
    group by 
      o.object_name, 
      o.owner, 
      s.osuser, 
      s.machine, 
      s.terminal, 
      p.spid, 
      s.process, 
      s.sid, 
      s.serial#, 
      decode (s.lockwait, null, 'Have Lock(s)', 'Waiting for <' || b.sid || '>'), 
      substr (c.sql_text, 1, 150) 
    order by 
      decode (s.lockwait, null, 'Have Lock(s)', 'Waiting for <' || b.sid || '>') desc, 
      o.object_name asc, 
      s.sid asc;

  8. #8
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 33
    Par défaut re
    Version d'oracle : 9.2.0.1 (9i)


    Merci pour ce script qui de voir plus de chose que le mien, la meme PGA entre autre, mais il n'y a aucune colonne qui permet de lie le verrou que je vois bien dans resultat de la requete a l'enregistrement verrouiller, j'ai essayer de trouver qq chose avec le package : DBMS_ROWID.rowid_block_number(rowid) mais rien a faire je ne trouve pas comment lie le verrou a l'enregistrement.
    IL y a bien un ID sur l'enre verrouille qui permet de lie le verrou a l'enre verrouille ?
    Pourquoi le rowid me retourne un truc du style AAAA654JHGKJBMM et que la table des verrous je ne retrouve pac cette info ?

    Merci

  9. #9
    Membre Expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Par défaut
    Peut-on avoir le resultat de la requête ?

  10. #10
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 33
    Par défaut re
    Voici le resultat de la requete :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SID	SER	Table	OWNER	OS User	Node	Terminal	Mode	SQL Text
    47	59042	P_PARC	GP	Administrateur	COMPTA\FL1ODSTEPHANE	FL1ODSTEPHANE	Have Lock(s)

  11. #11
    Membre Expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Par défaut
    Donc il faut killer la session 47

  12. #12
    Membre averti
    Inscrit en
    Mai 2004
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 33
    Par défaut ok
    D'accord je vois donc que je me suis mal exprime.....

    En fait qd j'ai lance la requete un seul enregistrement etait verrouille.

    Je reprends imaginons que 10 utilisateur connecte avec le meme user oracle verrouille 10 enregitrement parce qu'ils les consultent
    et
    qu'un onzieme utilisateur veut ouvrir un de ces enregistrements comment lui dire que c tel utilisateur qui verrouille l'enregistrement ?

    Sachant qu'a la connexion de chaque utilisateur j'enregistre ds la table des utilisateurs de l'application le SESSIONID.

    Comme savoir quel SESSIONID a pose un verrou sur tel enregistrement ?

    2 eme explication

    Je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT FOR UPDATE * FROM maTable WHERE monID=1
    il y a donc un verou poser sur cet enregistrement, comment je peux savoir que c tel user oracle de SESSIONID X qui a pose se verrou ?

    Merci

  13. #13
    Inactif
    Inscrit en
    Juin 2008
    Messages
    304
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 304
    Par défaut
    Bonjour;
    j'ai trouvée sa dans un tuto sa peut sérvire:


    Le comportement par défaut d'Oracle dans la gestion des accès concurrents peut être ignoré par un verrouillage

    explicitement demandé par l'utilisateur. Il y a peu de cas où cela s'avère nécessaire. Citons-en quelques-uns :

    1- La base que vous utilisez est très demandée. Les temps d'attente deviennent longs. Vous êtes prioritaire : vous
    demandez alors l'usage exclusif des tables que vous utilisez. Les autres n'y auront plus accès.

    2- Vous voulez travailler avec un état stable de la base pendant toute la durée d'une transaction. Vous voulez modifier
    la base. La transaction à lecture seulement ne suffit donc pas : vous demandez un usage exclusif de la table.

  14. #14
    Inactif
    Inscrit en
    Juin 2008
    Messages
    304
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 304
    Par défaut
    Bonjour;
    J’ai trouvée sa dans un tuto sa peut servir:


    Le comportement par défaut d'Oracle dans la gestion des accès concurrents peut être ignoré par un verrouillage

    explicitement demandé par l'utilisateur. Il y a peu de cas où cela s'avère nécessaire. Citons-en quelques-uns :

    1- La base que vous utilisez est très demandée. Les temps d'attente deviennent longs. Vous êtes prioritaire : vous
    demandez alors l'usage exclusif des tables que vous utilisez. Les autres n'y auront plus accès.

    2- Vous voulez travailler avec un état stable de la base pendant toute la durée d'une transaction. Vous voulez modifier
    la base. La transaction à lecture seulement ne suffit donc pas : vous demandez un usage exclusif de la table.

Discussions similaires

  1. Impossible de trouver le verrou -- verrous table désactivés
    Par ThanosT dans le forum Administration
    Réponses: 2
    Dernier message: 11/05/2007, 15h01
  2. Réponses: 1
    Dernier message: 04/06/2006, 00h18
  3. Réponses: 2
    Dernier message: 28/04/2006, 22h56
  4. Réponses: 3
    Dernier message: 15/03/2006, 14h53
  5. [Oracle 8i] ne garder que certains enregistrements (COUNT ?)
    Par delphim dans le forum Langage SQL
    Réponses: 13
    Dernier message: 23/02/2005, 14h30

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