Nie można tak naprawdę wymienić wszystkich wierszy blokowanych przez sesję. Jednak gdy sesja jest blokowana przez inną, możesz dowiedzieć się, która sesja / wiersz ją blokuje.
Oracle nie utrzymuje listy pojedynczych blokad wierszy. Zamiast tego zamki są rejestrowane bezpośrednio w samych rzędach - pomyśl o tym jak o dodatkowej kolumnie.
Możesz zobaczyć, która sesja uzyskała blokadę obiektu poprzez V$LOCK
widok, ale wyświetli to tylko informacje ogólne, a nie na poziomie wiersza.
W tym widoku możesz również sprawdzić, czy sesja jest blokowana przez inną. W takim przypadku, jeśli sesja jest blokowana przez inną sesję, informacje o wierszu są wyświetlane w V$SESSION
informacjach.
Możesz pobrać rowid, zbudujmy przykład z 2 sesjami:
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 */
Sesja 2 czeka teraz na sesję 1. Możemy odkryć wiersz blokujący za pomocą:
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
Do dalszej lektury: opis procesu autorstwa Toma Kyte'a .