Вы не можете в действительности перечислить все строки, которые заблокированы сеансом. Однако, как только сеанс блокируется другим, вы можете найти, какой сеанс / строка его блокирует.
Oracle не поддерживает список отдельных блокировок строк. Скорее, блокировки регистрируются непосредственно внутри самих строк - воспринимайте это как дополнительный столбец.
Вы можете найти, какой сеанс получил блокировку объекта через V$LOCK
представление, но в нем будет показана только общая информация, а не на уровне строк.
С помощью этого представления вы также можете определить, был ли сеанс заблокирован другим. В этом случае, если сеанс заблокирован другим сеансом, информация о строке отображается в V$SESSION
информации.
Вы можете получить rowid, давайте создадим пример с двумя сессиями:
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
Для дальнейшего чтения: описание процесса Тома Кайта .