ORA-00060死鎖的產生及解決

dayong2015發表於2015-05-20

死鎖是資料庫經常發生的問題,資料庫一般不會無緣無故產生死鎖,死鎖通常都是由於我們應用程式的設計本身造成的。
會話1:
-- 建立一個測試表,插入兩行
18:03:48 table tab_dl (id int,name varchar2(30));

Table created.

18:05:50 into tab_dl values (1,'DeadLock 1');

1 row created.

18:05:56 into tab_dl values (2,'DeadLock 2');

1 row created.

18:06:04 ;

Commit complete.

-- 分別在不同的會話對這兩行進行更新
18:06:06 tab_dl set name='DeadLock 3' where id=1;

1 row updated.

會話2:
18:07:14 tab_dl set name='DeadLock 4' where id=2;

1 row updated.

會話1:
18:07:37 tab_dl set name='DeadLock 5' where id=2;   --此會話在等待,在會話2更新id=1時檢測到死鎖,自動終止其中一個會話
update tab_dl set name='DeadLock 5' where id=2
       *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource

會話2:
18:08:00 tab_dl set name='DeadLock 6' where id=1;   --此會話一直在等等


-- 以上實驗結果得出結論:兩個會話同時互相阻塞對方的事務修改時,會產生死鎖。

產生死鎖時,如何解決呢,下面是常規的解決辦法:

會話1:

1)執行下面SQL,先檢視哪些表被鎖住了:

18:09:22 b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;

OWNER                          OBJECT_NAME          SESSION_ID LOCKED_MODE
------------------------------ -------------------- ---------- -----------
SCOTT                          TAB_DL                      144           3
SCOTT                          TAB_DL                       21           3

2)檢視引起死鎖的會話
18:09:24 b.username,b.sid,b.serial#,logon_time
18:09:40   2  from v$locked_object a,v$session b
18:09:40   3  where a.session_id = b.sid order by b.logon_time;

USERNAME                              SID    SERIAL# LOGON_TIME
------------------------------ ---------- ---------- ------------
SCOTT                                  21         53 27-SEP-13
SCOTT                                 144        369 27-SEP-13

3)檢視被阻塞的會話
18:11:09 * from dba_waiters;
WAITING_SESSION HOLDING_SESSION LOCK_TYPE                  MODE_HELD  MODE_REQUESTED    LOCK_ID1   LOCK_ID2
--------------- --------------- -------------------------- ---------- --------------- ---------- ----------
            144              21 Transaction                Exclusive  Exclusive           655372       1186

4)可以提交或回滾阻塞的話,釋放鎖或者殺掉ORACLE程式:
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';    --對應上例中的21,53

 

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

相關文章