我正在寻找一种方法来找出在过去的会话中是否存在未提交的语句。
我已经在当前会话中检查了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
是否可以找到使用未提交交易的会话ID和用户ID ?
我知道如何在当前会话中进行检测,但在过去的会话中检测不到。
答案 0 :(得分:0)
如果我了解您要执行的操作,则无需去寻找未提交的交易。 DBA_HIST_ACTIVE_SESS_HISTORY
有一个BLOCKING_SESSION
列,它将告诉您当时会话正在等待什么。
在会话等待enq: TX - row lock contention
的情况下,阻塞会话应该是持有锁的会话(即,您正在寻找的“未提交的事务”中间的会话)。 / p>
要获取有关其阻止程序的会话的详细信息,请执行以下操作:
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
答案 1 :(得分:0)
当我使用您的请求时,找不到根本原因:
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)阻止。 您是否知道如何查找根阻止会话ID及其SQL_ID,因为需要在Java代码中搜索导致该阻止会话的未关闭事务。