Salut,
j'aimerais savoir comment retrouver le nom de l'utilisateur ayant verrouillé une ligne dans une table ?
Merci
Oracle 9.2
Salut,
j'aimerais savoir comment retrouver le nom de l'utilisateur ayant verrouillé une ligne dans une table ?
Merci
Oracle 9.2
Bonjour,
Je pense que vous cherchez ca :
select b.username est_bloque, b.sid, b.serial#, d.username bloqueur, d.sid, d.serial#
from v$lock a, v$session b, v$lock c, v$session d
where a.type = 'TX' and
a.request = 6 and
a.sid = b.sid and
a.id1 = c.id1 and
a.id2 = c.id2 and
c.sid = d.sid and
c.request = 0
Cordialement,
Laly.
Merci,
cela fonctionne si on exécute la requête suivante :
J'ai oublié de préciser que je recherche cette info dans le cas ou j'effectue la requête suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part select col,col2 from table for update
Dans ce cas ta solution ne fonctionne plus car les vues système ne semblent pas mémoriser ces infos.
Code : Sélectionner tout - Visualiser dans une fenêtre à part select col,col2 from table for update NOWAIT
Bonjour,
Pour moi ca fonctionne bien :
Session 1 :
select * from t for update nowait
Session 2
update t set x = 3 -> la session est bloqué
Et quand j'exécute ma requête je vois bien la ligne correspondante...
Est-ce-que j'ai bien compris ton scénario ? Quel est le résultat de la requête pour toi ?
Cordialement,
Laly.
bah oui... NOWAIT -> pas de lock... ou est le probléme ?Envoyé par Laurent Dardenne
Je suis pas d'accord avec toi : select ... for update NOWAIT : on veut verrouiller la ligne, si la ligne est déjà verrouillé renvoie immédiatement un message d'erreur au lieu de rester bloqué, sinon on a verrouillé la ligne.
Laly.
houla oui, tu as raison les vendredis sont difficiles
Et que donne cette requête ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 select substr(a.os_user_name,1,8) "OS User" , substr(a.oracle_username,1,8) "DB User" , substr(b.owner,1,8) "Schema" , substr(b.object_name,1,20) "Object Name" , substr(b.object_type,1,10) "Type" ,a.session_id "SID" from v$locked_object a , all_objects b where a.object_id = b.object_id and object_name = '&table'
En voila une autre plus "jolie"
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 col sid for 999 head ' |sid' col id1 for 9999999 head 'resource|ID 1' col id2 for 999999 head 'res.|ID 2' col command for 999 head 'command|num' col held for a4 head 'mode|held' col req for 9990 head 'mode|req' col osuser for a8 head 'unix|username' col username for a6 head 'oracle|user' col objname for a26 head 'object name|ID1' col type for a4 head 'lock|type' select s.username,s.osuser,l.sid,l.type, decode(l.lmode,0,'NONE',1,'NULL',2,'RS',3,'RX',4,'S',5,'SRX',6,'X','?') held, decode(l.request,0,'NONE',1,'NULL',2,'RS',3,'RX',4,'S',5,'SRX',6,'X','?') req, l.id1,l.id2,nvl(o.object_name,'NONE') objname from v$lock l,v$session s,sys.dba_objects o where l.sid=s.sid and l.id1=o.object_id(+) and o.object_name = '&objet' and s.username is not null /* and l.type in ('TM','TX','UL') */ order by l.id1,l.id2,l.sid /
Bonjour,
j'ai le meme soucis
un user 1 fait :
==> la ligne est verrouillée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select chps1 from table 1 where cond1 for update nowait;
un user 2 fait :
la ligne n'est pas verrouillée
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 select chps1 from table 1 where cond1 for update nowait;
Mais comment indiqué à user 2 que c'est user 1 qui le bloque ?
Il faut traper le code erreur en retour ( 'ressource busy' )
ben ça ne marche pas
voici le code que j'utilise :
Je precise que la ligne que j'essaies de verrouiller l'est déjà par une autre session.
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 declare ligne_verrouillee exception; pragma exception_init (ligne_verrouillee,-54); str varchar2(100); begin select champs1 into str from table1 where champs1='1' for update nowait; exception when ligne_verrouillee Then select b.username ||' Bloqué par : '|| d.username into str from v$lock a, v$session b, v$lock c, v$session d where a.type = 'TX' and a.request = 6 and a.sid = b.sid and a.id1 = c.id1 and a.id2 = c.id2 and c.sid = d.sid and c.request = 0; dbms_output.Put_line(str); ENd;
La requete qui est censée me donner le bloqueur me retourne un No_Data_Found
Any idea ?
Bonjour,
Bien sur ca marche pas, puisque tu n'es pas bloqué :wink:
Tu peux essayer ca alors mais il faut vérifier dans la doc quand est acquis un lock TM :
select 'est bloqué par ' || username
from v$session
where sid in (
select sid from v$lock where id1 = (select object_id from user_objects where object_name = 'maTable')
)
Laly.
le probleme c'est que plusieurs users bloquent plusieurs ligne differentes mais sur la meme table
Je ne sais pas si cela pourra vous aider, mais voici une requête qui montre qui bloque qui à travers les verrous
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 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;
ça marche chez moi ceci :
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 declare ligne_verrouillee exception; pragma exception_init (ligne_verrouillee,-54); str varchar2(100); begin select champs1 into str from table1 where champs1='1' for update nowait; exception when ligne_verrouillee then select s.username || ' ' || s.osuser || ' ' || l.sid || ' ' || l.type || ' ' || decode(l.lmode,0,'NONE',1,'NULL',2,'RS',3,'RX',4,'S',5,'SRX',6,'X','?') || ' ' || decode(l.request,0,'NONE',1,'NULL',2,'RS',3,'RX',4,'S',5,'SRX',6,'X','?') || ' ' || l.id1 || ' ' || l.id2 || ' ' || nvl(o.object_name,'NONE') into str from v$lock l,v$session s,sys.dba_objects o where l.sid=s.sid and l.id1=o.object_id(+) and o.object_name = 'ma table' and s.username is not null /* and l.type in ('TM','TX','UL') */ order by l.id1,l.id2,l.sid; dbms_output.Put_line(str); ENd;
je suis d'accord avec toi, mais maintenant si plusieurs user ont posé un verrou sur des lignes differentes de la meme table, comment tu fais ?
Merci,
je vais tester vos requêtes.
Aprés qq essais les requêtes proposées par Aline et Echoes ne régle pas le pb.
Celle d'Echoes renvoi No_Data_Found:
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 1 declare 2 ligne_verrouillee exception; 3 pragma exception_init (ligne_verrouillee,-54); 4 str varchar2(100); 5 begin 6 select num into str 7 from fiches 8 where num ='152337' 9 for update nowait; 10 exception 11 when ligne_verrouillee then 12 begin 13 select s.username || ' ' || s.osuser || ' ' || l.sid || ' ' || l.type || ' ' || 14 decode(l.lmode,0,'NONE',1,'NULL',2,'RS',3,'RX',4,'S',5,'SRX',6,'X','?') || ' ' || 15 decode(l.request,0,'NONE',1,'NULL',2,'RS',3,'RX',4,'S',5,'SRX',6,'X','?') || ' ' || 16 l.id1 || ' ' || l.id2 || ' ' || nvl(o.object_name,'NONE') into str 17 from v$lock l,v$session s,sys.dba_objects o 18 where l.sid=s.sid 19 and l.id1=o.object_id(+) 20 and o.object_name = 'ma table' 21 and s.username is not null 22 /* and l.type in ('TM','TX','UL') */ 23 order by l.id1,l.id2,l.sid; 24 dbms_output.Put_line(str); 25 end; 26* ENd; mona@DEV> / declare * ERROR at line 1: ORA-01403: no data found ORA-06512: at line 13 ORA-00054: resource busy and acquire with NOWAIT specified
il faut penser à remplacer "ma table" dans la requête des verrous en "fiches"
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager