如何在 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+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.