Você não pode realmente listar todas as linhas que estão sendo bloqueadas por uma sessão. No entanto, uma vez que uma sessão está sendo bloqueada por outra, você pode descobrir qual sessão / linha está bloqueando-a.
O Oracle não mantém uma lista de bloqueios de linha individuais. Em vez disso, os bloqueios são registrados diretamente nas próprias linhas - pense nisso como uma coluna extra.
Você pode descobrir qual sessão adquiriu um bloqueio em um objeto através da V$LOCK
visualização, mas isso listará apenas informações gerais, não no nível da linha.
Com essa visualização, você também pode descobrir se uma sessão está sendo bloqueada por outra. Nesse caso, se uma sessão for bloqueada por outra, as informações da linha serão exibidas nas V$SESSION
informações.
Você pode recuperar o rowid, vamos criar um exemplo com 2 sessões:
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 */
A sessão 2 agora está aguardando a sessão 1. Podemos descobrir a linha de bloqueio com:
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
Para leitura adicional: uma descrição do processo por Tom Kyte .