ORACLE死鎖檢測

china_yebin發表於2010-01-30

ORACLE死鎖檢測:

以下測試使用scott使用者的emp作測試物件,
測試目的是檢測oracle死鎖檢測功能。

1.在shell1使用sqlplus連線scott使用者,並對emp的ename='SMITH'記錄進行for update鎖定。
SQL> select empno, ename from emp;

     EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD

SQL> select ename from emp where ename = 'SMITH' for update;

ENAME
----------
SMITH

2.在shell2中使用sqlplus連線scott使用者,並對emp的ename='ALLEN'記錄進行for update鎖定。
SQL> select ename from emp where ename = 'ALLEN' for update;

ENAME
----------
ALLEN

3.在shell1中,繼續對emp的ename='ALLEN'記錄進行for update鎖定。
SQL> select ename from emp where ename = 'ALLEN' for update;

4.在shell1中,繼續對emp的ename='SMITH'記錄進行for update鎖定,在過了3秒左右的時間,SQLPLUS報出死鎖錯誤,並退出等待。
SQL> select ename from emp where ename = 'SMITH' for update;
select ename from emp where ename = 'SMITH' for update
                  *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource


在第四步發出而未報出死鎖錯誤前使用sys使用者觀察鎖的狀態:
SQL> select SID,TYPE,LMODE,REQUEST,BLOCK from v$lock where type = 'TX';

       SID TY      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ----------
       142 TX          0          6          0
       154 TX          0          6          0
       142 TX          6          0          1
       154 TX          6          0          1
      
報出死鎖錯誤後以sys使用者觀察鎖的狀態:
SQL> select OBJECT_ID,SESSION_ID,LOCKED_MODE from v$locked_object;

 OBJECT_ID SESSION_ID LOCKED_MODE
---------- ---------- -----------
     51148        142           3
     51148        154           3

SQL> select SID,TYPE,LMODE,REQUEST,BLOCK from v$lock where type = 'TX';

       SID TY      LMODE    REQUEST      BLOCK
---------- -- ---------- ---------- ----------
       154 TX          0          6          0
       142 TX          6          0          1
       154 TX          6          0          0
      
SQL> select WAITING_SESSION, HOLDING_SESSION from dba_waiters;

WAITING_SESSION HOLDING_SESSION
--------------- ---------------
            154             142
           
SID=154為shell1
SID=142為shell2

從以上檢視可以看出,
未報死鎖錯誤前:
142持有2個TX鎖,其中一個阻塞另一鎖(154)。
154持有2個TX鎖,其中一個阻塞另一鎖(142)。
形成死鎖狀態。

報死鎖錯誤後:
142持有1個TX鎖,並阻塞另一鎖(154),而第二次發出的鎖定已被oracle清除。
154持有1個TX鎖並且有一個鎖處於等待狀態(等待142)。
解除死鎖狀態。

避免死鎖的方法:
按相同順序訪問資源,從而避免互鎖和死鎖的發生。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13605188/viewspace-626444/,如需轉載,請註明出處,否則將追究法律責任。

相關文章