【问题标题】:Oracle UPDATEs to Certain Table Hang Indefinitely对某些表的 Oracle 更新无限期挂起
【发布时间】:2010-11-17 00:52:51
【问题描述】:

我可以更新一些表就好了,但是我的某个表不能被我的 ASP.NET 应用程序或 SQLPLUS 更新。两者都无限期地挂起。我不得不强行退出 SQLPLUS。我在运行的标准 OracleCommand 对象中都有更新语句:

cmd.ExecuteNonQuery();

但我也将 asp:SqlDataSources 绑定到 GridView。似乎没有任何效果。

这里有一个类似的问题:Oracle Update Hangs。我有一个粗略的想法,就是这张桌子上必须有某种锁,但我不知道如何删除它,甚至不知道如何找到它。任何帮助将不胜感激。

我正在运行 Oracle 9i EE 9.2。

【问题讨论】:

    标签: database oracle sqlplus


    【解决方案1】:

    可能是另一个会话有未提交的工作(即更新或删除)

    您可以找到这可能与哪些会话...

    select s1.username || '@' || s1.machine    || ' ( SID=' || s1.sid || ' ) is blocking '
      || s2.username || '@' || s2.machine || ' ( SID=' || s2.sid || ' ) ' AS blocking_status
      from v$lock l1, v$session s1, v$lock l2, v$session s2
      where s1.sid=l1.sid and s2.sid=l2.sid
      and l1.BLOCK=1 and l2.request > 0
      and l1.id1 = l2.id1
      and l2.id2 = l2.id2
    

    编辑:

    很可能你在某处有大量缺少 COMMIT 的代码。

    检查 V$SESSION 中的违规会话 id,看看你是否能找出它可能是哪个代码。

    为了帮助您找到 rouge 代码(假设是这样),您可以使用...找到会话运行的最后一条 SQL 命令。

    select *
    from   v_$sqltext, v_$session
    where  v_$session.prev_hash_value = v_$sqltext.hash_value
    and    [some filter on v_$session]
    

    【讨论】:

    • 非常酷,谢谢。现在,它返回 6 行 SID 28 阻止 6 个不同 SID。我如何让那些畅通无阻? =)
    • 如果您无法提交/回滚这些会话,那么您可以使用 ALTER SYSTEM KILL SESSION 'session-id,session-serial' 终止它们。小心你确切知道你正在杀死什么,如果你可以简单地结束它正在运行的导致阻塞的事务,请避免这样做
    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 2011-05-07
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2019-08-01
    相关资源
    最近更新 更多