Vous ne pouvez pas vraiment répertorier 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 quelle session / ligne 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 quelle session a acquis un verrou sur un objet via la V$LOCK
vue, mais cela ne listera que les 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 de ligne s'affichent dans les V$SESSION
informations.
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 de blocage 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: une description du processus par Tom Kyte .