Realmente no puede enumerar todas las filas que están bloqueadas por una sesión. Sin embargo, una vez que otra sesión está bloqueando una sesión , puede encontrar qué sesión / fila la está bloqueando.
Oracle no mantiene una lista de bloqueos de fila individuales. Por el contrario, los bloqueos se registran directamente dentro de las propias filas; piense en ello como una columna adicional.
Puede encontrar qué sesión ha adquirido un bloqueo en un objeto a través de la V$LOCK
vista, pero esto solo mostrará información general, no a nivel de fila.
Con esta vista también puede encontrar si una sesión está siendo bloqueada por otra. En ese caso, si otra sesión bloquea una sesión, la información de la fila se muestra en la V$SESSION
información.
Puede recuperar el rowid, construyamos un ejemplo con 2 sesiones:
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 sesión 2 ahora está esperando la sesión 1. Podemos descubrir la fila de bloqueo con:
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 leer más: una descripción del proceso por Tom Kyte .