如何在 Oracle 中识别阻塞和被阻塞的会话?


问题

您希望识别数据库中的阻塞和被阻塞的会话。

解决方案

当我们在 Oracle 数据库中看到排队等待事件时,很可能有一些东西正在锁定或阻止某些会话执行其 SQL 语句。当一个会话等待“排队”等待事件时,该会话正在等待另一个会话持有的锁。我们可以发出以下命令来查看有关 Oracle 中阻塞和被阻塞会话的信息。

示例

SELECT DECODE(request,0,'Holder: ','Waiter: ') || sid sess,   id1,   id2,   lmode,   request,   type FROM v$lock WHERE (id1, id2, type) IN   (SELECT id1, id2, type FROM v$lock WHERE request > 0   ) ORDER BY id1,   request;

V$LOCK 视图显示实例中是否存在任何阻塞锁。如果存在阻塞锁,它还会显示阻塞会话和被阻塞会话。

如果所有会话都想要使用被阻塞的同一对象,则阻塞会话可以同时阻塞多个会话。

您可以使用以下 SQL 获取信息。

示例

select sid,type,lmode,request,ctime,block from v$lock;

输出

   SID           TY           LMODE             REQUEST       CTIME        BLOCK --------------     --------     -----------    -----------   --------     -------            140           TX              4             6          11655          0         38           TM              3             0            826          0         38           TX              6             0            826          1

需要关注的关键列是 BLOCK 列,该列对于阻塞会话的值为 1。在我们的示例中,会话 38 是阻塞会话,因为它在 BLOCK 列下显示值为 1。阻塞会话(SID 为 38)还在 LMODE 列下显示锁模式 6,这意味着它以独占模式持有此锁。因此,会话 140 因相同原因而挂起,无法执行其更新操作。被阻塞的会话在 BLOCK 列中显示值为 0。

如果您想了解阻塞会话的等待类别以及它阻塞其他会话的时间长度,我们可以通过查询 V$SESSION 视图来实现。

示例

SELECT blocking_session,   sid,   wait_class,   seconds_in_wait FROM v$session WHERE blocking_session IS NOT NULL ORDER BY blocking_session;

输出

BLOCKING_SESSION        SID           WAIT_CLASS        SECONDS_IN_WAIT -----------------    --------       -------------    -------------------        38                140          Application                  1237

更新时间: 2020-12-05

24K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告