我正在使用以下信息获取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会话? 如何获得有关此INACTIVE会话的更多信息?
答案 0 :(得分:0)
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
状态。
现在,当Session 2执行相同的 SQL时会发生什么?
它将尝试更新相同的行,但会被未提交的INACTIVE
会话1阻止,因此会继续保持锁定状态。与此同时,会话2仍为ACTIVE
,并且将保持阻塞并保持ACTIVE
,直到会话1提交或回滚。
希望这很清楚。