Non puoi davvero elencare tutte le righe che sono bloccate da una sessione. Tuttavia, una volta che una sessione viene bloccata da un'altra, puoi trovare quale sessione / riga la sta bloccando.
Oracle non mantiene un elenco di singoli blocchi di righe. Piuttosto, i lucchetti sono registrati direttamente all'interno delle righe stesse - pensalo come una colonna aggiuntiva.
Puoi vedere quale sessione ha acquisito un blocco su un oggetto attraverso la V$LOCK
vista, ma questo elencherà solo informazioni generali, non a livello di riga.
Con questa vista puoi anche scoprire se una sessione è bloccata da un'altra. In tal caso, se una sessione viene bloccata da un'altra sessione, le informazioni sulla riga vengono visualizzate nelle V$SESSION
informazioni.
Puoi recuperare il rowid, costruiamo un esempio con 2 sessioni:
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 Sessione 2 è ora in attesa sulla Sessione 1. Possiamo scoprire la riga di blocco 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
Per ulteriori letture: una descrizione del processo di Tom Kyte .