Ви не можете перелічити всі рядки, які блокуються сеансом. Однак, коли сеанс заблокується іншим, ви можете виявити, який сеанс / рядок блокує його.
Oracle не підтримує список окремих блокувань рядків. Швидше замки реєструються безпосередньо всередині самих рядків - подумайте про це як додатковий стовпчик.
Ви можете дізнатися, який сеанс придбав блокування об'єкта за допомогою V$LOCK
перегляду, але це буде лише загальна інформація, а не на рівні рядків.
За допомогою цього перегляду ви також можете дізнатися, чи блокується сеанс іншим. У цьому випадку, якщо сеанс блокується іншим сеансом, інформація про рядки відображається в V$SESSION
інформації.
Ви можете отримати rowid, давайте побудуємо приклад з 2-х сеансів:
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 */
Сесія 2 тепер чекає на сесію 1. Ми можемо виявити блокування рядка за допомогою:
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
Для подальшого читання: опис процесу Тома Кейта .