【问题标题】:How to find out past pending transactions如何找出过去的待处理交易
【发布时间】:2018-07-05 23:28:31
【问题描述】:

我正在寻找一种方法来了解是否有过去会议中未提交的陈述

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

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

【问题讨论】:

    标签: database oracle


    【解决方案1】:

    如果我了解您要执行的操作,则无需查找未提交的事务。 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
    

    【讨论】:

      【解决方案2】:

      当我使用你的请求时,我没有找到根本原因:

      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) 作为阻塞会话。然后随着您的加入,它表明会话 5781 被会话 1907 (2018-06-29 13:37:10.006) 阻止。 您是否知道如何找到根阻塞会话 ID 及其 SQL_ID,因为需要在 Java 代码中搜索导致此阻塞会话的非关闭事务。

      【讨论】:

        猜你喜欢
        • 2021-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        相关资源
        最近更新 更多