oracle INACTIVE 会话正在阻塞活动会话需要一种方法来找到阻塞的 sqlid

akk*_*346 1 java oracle session

我得到了 oracle 11g 数据库的锁,信息如下

06112017:11:00:09    WELOPP@n1pv97/46581  (Session=('300,19867')Status=INACTIVE sqlid=>) blocking WELOPP@n1pv97/45876          (Session=('1803,10683')
                      Status=ACTIVE sqlid=fp5x2quh0zpqk) for the last 91850 seconds.

06112017:11:00:09    WELOPP@n1pv97/46581  (Session=('300,19867')Status=INACTIVE sqlid=>) blocking WELOPP@n1pv97/59864          (Session=('843,58185')
                       Status=ACTIVE sqlid=fp5x2quh0zpqk) for the last 5388 seconds.
Run Code Online (Sandbox Code Playgroud)

INACTIVE 会话如何阻止 ACTIVE 会话?我如何获得有关此 INACTIVE 会话的更多信息?

Mar*_*bak 5

一个INACTIVE会话阻塞一个会话非常简单ACTIVE。首先,之间的差异ACTIVEINACTIVE

一个ACTIVE会话只是一个是目前在数据库中调用。一个INACTIVE会话不是。一个简单的例子是,如果您有一个通过 的数据库连接SQL*Plus,并且它位于SQL>提示符处,那就是一个INACTIVE会话。只要您执行SQLorPL/SQL语句,会话就会变成ACTIVE

现在,至于INACTIVE会话如何阻止一个会话ACTIVE,这非常简单。

想象两个SQL*Plus会话,都在SQL>提示时闲置。两者都是INACTIVE。现在,会话 1 执行:

update taba set col2='Hello world' where col1=1;
Run Code Online (Sandbox Code Playgroud)

会话 1 将暂时变为ACTIVE,并锁定它更新的行,然后返回INACTIVE状态。

现在,当会话 2 执行相同的SQL时会发生什么?

它将尝试更新相同的行,但会被INACTIVE尚未提交的会话 1阻塞,因此继续持有锁。与此同时,会话 2 仍然是ACTIVE,并将保持阻塞状态,ACTIVE直到会话 1 提交或回滚。