Как узнать прошлые незавершенные транзакции - PullRequest
0 голосов
/ 02 июля 2018

Я ищу способ выяснить, есть ли незафиксированные заявления в прошлых сеансах .

Я уже проверил в текущем сеансе V $ TRANSACTION, но ничего нет.

Я обнаружил, что первое устранение неполадок было произведено в 2018-06-29 13: 35: 07.236 с использованием этого запроса:

SELECT * FROM DBA_HIST_ACTIVE_SESS_HISTORY  
where 
event ='enq: TX - row lock contention' and  
sample_time > ({ts '2018-06-29 12:41:09'})
order by  sample_time ASC

Есть ли способ узнать идентификатор сеанса и идентификатор пользователя, который использовал незафиксированные транзакции ?

Я знаю, как обнаружить в текущих сессиях, но нет в прошлой сессии.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Когда я использую ваш запрос, я не могу найти основную причину:

SELECT s.*, blk.*
FROM dba_hist_active_sess_history s
INNER JOIN dba_hist_active_sess_history blk
ON blk.session_id = s.blocking_session
AND blk.dbid = s.dbid
AND blk.snap_id = s.snap_id
AND blk.instance_number = s.instance_number
AND blk.sample_id = s.sample_id
where 
s.event ='enq: TX - row lock contention' and  
s.sample_time > ({ts '2018-06-29 12:41:09'})
order by  s.sample_time ASC

Отображается 5781 (2018-06-29 13: 37: 10.006) как blocking_session. И затем с вашим соединением это означает, что сеанс 5781 заблокирован сеансом 1907 (2018-06-29 13: 37: 10.006). Знаете ли вы, как найти идентификатор сеанса корневой блокировки и его SQL_ID, потому что это необходимо для поиска в коде Java незамкнутой транзакции, которая вызвала этот сеанс блокировки.

0 голосов
/ 02 июля 2018

Если я понимаю, что вы пытаетесь сделать, нет необходимости искать незавершенные транзакции. DBA_HIST_ACTIVE_SESS_HISTORY имеет столбец BLOCKING_SESSION, в котором будет указано, что ожидал сеанс в это время.

В случае сеанса, ожидающего на enq: TX - row lock contention, сеанс блокировки должен быть сеансом, который удерживал блокировку (т.е. сеанс в середине "незафиксированной транзакции", которую вы искали).

Чтобы узнать подробности сеансов с их блокировщиками, сделайте что-то вроде этого:

SELECT s.*, blk.*
FROM dba_hist_active_sess_history s
-- Add this join to get blocking session
INNER JOIN dba_hist_active_sess_history blk
ON blk.session_id = s.blocking_session
AND blk.dbid = s.dbid
AND blk.snap_id = s.snap_id
AND blk.instance_number = s.instance_number
AND blk.sample_id = s.sample_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...