我正在尝试使用以下查询来识别阻塞会话:
SELECT
v1.sid esid, v1.blocking_session bsid, v1.process, v1.wait_class, v1.event, v1.sql_id, v1.seconds_in_wait waitss, v2.blocking_session bsid2, v2.process,
v2.sql_id, v2.wait_class, v2.event
from
v$session v1, v$session v2
where
v1.blocking_session is not null and v1.blocking_session = v2.sid
order by
waitss desc
这是示例输出:
ESID BSID PROCESS WAIT_CLASS EVENT SQL_ID WAITSS BSID2 PROCESS_1 SQL_ID_1 WAIT_CLASS_1 EVENT_1
2707 2313 8526 Application enq: TX - row lock contention 05v90pbavkptk 11 (null) 28152 (null) Idle SQL*Net message from client
这表明阻塞会话是空闲的。也许我遗漏了一些东西,但我不明白没有执行任何语句的空闲会话如何阻塞任何东西。
空闲会话似乎锁定了阻塞查询所需的至少一条记录。用户已经执行了获取锁的查询。通常,锁定将一直保持到他们提交或回滚事务为止。
当开发人员在更新或插入数据的过程中去吃午饭时,我已经遇到过几次这种情况。他们吃完午饭回来后不久,锁就被拆除了。
如果他们的会话超时或您终止他们的会话,则事务应回滚并释放锁定。
如果您可以确定他们从哪个位置连接,您可以联系他们并请求他们提交或回滚他们的事务。