Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Как получить информация о сеансах работы с БД в которых есть незакрытые транзакции?

#sql #oracle #oracle11g


Как из представлений словаря данных (насколько понимаю, нужно обращаться к v$session
и v$transaction и делать выборку v$session.sid и v$session.username) получить информацию
обо всех сеансах работы с БД, в которых есть незакрытые транзакции? 

Например, через консоль и SQL*Plus в виде двух колонок - ид сеанса и имя пользователя.

Для определения незакрытых транзакций можно ли использовать ограничение v$transaction.flag=7811?
Например, так:

SELECT v$session.sid, v$session.username
FROM v$session, v$transaction
WHERE v$transaction.flag=7811;


Версия: Oracle Database 11g Release 2
    


Ответы

Ответ 1



Попробуйте так: select s.sid, s.serial#, s.username from v$transaction t inner join v$session s on t.addr = s.taddr ; no rows selected select 1 from t1 for update; select s.sid, s.serial#, s.username from v$transaction t inner join v$session s on t.addr = s.taddr ; SID SERIAL# USERNAME ---------- ---------- ---------- 34 55338 OE Следует учесть, что "незакрытые транзакции" не означает, что произошли изменения данных. В примере выше, например, запрос с for update ничего не изменил.

Ответ 2



@0xdb уже показал вам как посмотреть все транзакции. Иногда бывает полезным найти только тех пользователей и их сессии, которые блокируют какие либо объекты БД (таблицы, индексы и т.д.): set lines 200 pages 200 col inst_id for 99 col obj for a45 col lock_mode for a16 col blocker_sid_serial_sqlid for a45 col os_user_pid for a18 col machine for a30 break on blocker_sid_serial_sqlid skip page select l.inst_id as inst_id ,o.owner||'.'||o.object_name as obj ,case l.locked_mode when 0 then '0:none' when 1 then '1:null (NULL)' when 2 then '2:row-S (SS)' when 3 then '3:row-X (SX)' when 4 then '4:share (S)' when 5 then '5:S/Row-X (SSX)' when 6 then '6:exclusive (X)' else to_char(l.locked_mode) end as lock_mode ,l.oracle_username||' ('||s.sid||','||s.serial#||') ['||s.sql_id||']' as blocker_sid_serial_sqlid ,l.os_user_name||' ['||l.process||']' as os_user_pid ,s.machine from gv$locked_object l join dba_objects o on l.object_id = o.object_id join gv$session s on (s.sid = l.session_id and s.inst_id=l.inst_id) /* where o.owner like '&&OWNER.%' */ order by inst_id, blocker_sid_serial_sqlid, obj ;

Комментариев нет:

Отправить комментарий