我正在使用以下信息在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.


不活动的会话如何阻止活动的会话?
我如何获得有关此不活跃会议的更多信息?

最佳答案

INACTIVE会话阻止一个ACTIVE会话非常简单。首先,ACTIVEINACTIVE之间的区别。

ACTIVE会话只是当前在数据库调用中的一个会话。 INACTIVE会话不是。一个简单的示例是,如果您通过SQL*Plus建立了数据库连接,并且它位于SQL>提示符下,那就是INACTIVE会话。一旦执行SQLPL/SQL语句,会话将变为ACTIVE

现在,关于INACTIVE会话如何阻止ACTIVE一个会话,这很简单。

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

update taba set col2='Hello world' where col1=1;


会话1将立即变为ACTIVE,并对其更新的行进行锁定,并返回到INACTIVE状态。

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

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

希望很清楚。

09-28 09:43