web-dev-qa-db-fra.com

Lorsqu'un enregistrement est verrouillé dans Oracle, pouvons-nous savoir quel enregistrement est verrouillé?

Lorsqu'un enregistrement est verrouillé, pouvons-nous savoir lequel est verrouillé?

Comment puis-je obtenir le record rowid ou autre chose?


Je peux obtenir des informations par ce sql

SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW#
   FROM v$locked_object a, dba_objects b, v$session c    
WHERE a.object_id = b.object_id    
    AND a.SESSION_ID = c.sid(+) 

J'ai trouvé une méthode sur le Web pour obtenir rowid en utilisant la fonction DBMS_ROWID.ROWID_CREATE()

Mais cela ne semble pas fonctionner.

10
iafanda

Vous ne pouvez pas vraiment lister toutes les lignes qui sont verrouillées par une session. Cependant, une fois qu'une session est bloquée par une autre, vous pouvez trouver la session/ligne qui la bloque.

Oracle ne gère pas de liste de verrous de ligne individuels. Au contraire, les verrous sont enregistrés directement à l'intérieur des lignes elles-mêmes - pensez-y comme une colonne supplémentaire.

Vous pouvez trouver la session qui a acquis un verrou sur un objet via V$LOCK vue, mais cela ne listera que des informations générales, pas au niveau de la ligne.

Avec cette vue, vous pouvez également trouver si une session est bloquée par une autre. Dans ce cas, si une session est bloquée par une autre session, les informations sur la ligne sont affichées dans le V$SESSION information.

Vous pouvez récupérer le rowid, construisons un exemple avec 2 sessions:

SESSION1> create table test as select * from all_objects;

Table created

SESSION1> select rowid from test where object_name = 'TEST' for update;

ROWID
------------------
AAMnFEAAaAAALTDAAz

/* setting identifiers to help with identifying this session later */
SESSION2> exec dbms_application_info.set_client_info('012345');

PL/SQL procedure successfully completed

SESSION2> select 1 from test where object_name = 'TEST' for update;
/*  this will block */

La session 2 attend maintenant la session 1. Nous pouvons découvrir la ligne bloquante avec:

SESSION1> SELECT o.object_name,
       2         dbms_rowid.ROWID_CREATE (1,
       3                                  s.ROW_WAIT_OBJ#,
       4                                  s.ROW_WAIT_FILE#,
       5                                  s.ROW_WAIT_BLOCK#,
       6                                  s.ROW_WAIT_ROW#) rid
       7     FROM dba_objects o, v$session s
       8    WHERE o.object_id = s.row_wait_obj#
       9      AND s.client_info = '012345';

OBJECT_NAME     RID
--------------- ------------------
TEST            AAMnFEAAaAAALTDAAz

Pour en savoir plus: a description du processus par Tom Kyte .

13
Vincent Malgrat

Vous pouvez trouver tous les verrous de tables dans une base de données Oracle en exécutant la requête suivante

select
   c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c
where
   b.sid = a.session_id
and
   a.object_id = c.object_id;
3
Baji Shaik