如何找出过去的未决交易

时间:2018-07-02 10:10:26

标签: database oracle

我正在寻找一种方法来找出在过去的会话中是否存在未提交的语句

我已经在当前会话中检查了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

我知道如何在当前会话中进行检测,但在过去的会话中检测不到。

2 个答案:

答案 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代码中搜索导致该阻止会话的未关闭事务。