我正在使用以下信息在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
会话非常简单。首先,ACTIVE
和INACTIVE
之间的区别。ACTIVE
会话只是当前在数据库调用中的一个会话。 INACTIVE
会话不是。一个简单的示例是,如果您通过SQL*Plus
建立了数据库连接,并且它位于SQL>
提示符下,那就是INACTIVE
会话。一旦执行SQL
或PL/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提交或回滚为止。希望很清楚。