ORA-00060死鎖的產生及解決
死鎖是資料庫經常發生的問題,資料庫一般不會無緣無故產生死鎖,死鎖通常都是由於我們應用程式的設計本身造成的。
會話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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORA-00060: Deadlock detected 模擬死鎖產生與解決方案
- SQ死鎖及死鎖的解決
- 鎖的種類,阻塞,死鎖產生與解決辦法。
- 死鎖檢測及解決
- 死鎖(ora-00060)以及死鎖相關的知識點
- (資料庫十)資料庫中的鎖機制以及死鎖產生的原因及解決辦法資料庫
- 【Oracle】死鎖的產生與處理Oracle
- mysql之神奇的死鎖及解決思路MySql
- Oracle死鎖一例(ORA-00060),鎖表導致的業務死鎖問題Oracle
- synchronized 內部原理、常見鎖策略、CAS、 以及死鎖的產生和解決synchronized
- 常見的死鎖情況及解決方法
- MySQL 死鎖解決MySql
- MySQL解決死鎖MySql
- Java 程式死鎖問題原理及解決方案Java
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法
- 【Mysql】兩條insert 語句產生的死鎖MySql
- 解決Oracle死鎖的快捷方法Oracle
- ORACLE ERP解決死鎖的方案Oracle
- 由Oracle觸發器死鎖及行級鎖限制所衍生的解決方案Oracle觸發器
- 【死鎖】ORA-00060: deadlock detected while waiting for resourceWhileAI
- 測試庫死鎖診斷DEADLOCK DETECTED ( ORA-00060 )
- sqlserver大數批次update時死鎖的問題及解決方案SQLServer
- cursor: pin S產生原理及解決方法
- impdp操作產生大量UNDO的原因及解決方法
- MySQL死鎖分析與解決之路MySql
- oracle死鎖測試與解決Oracle
- 解決Oracle資料庫死鎖Oracle資料庫
- 記憶體混亂及解決方法和死鎖問題記憶體
- Oracle資料表死鎖的解決方法Oracle
- Linux中產生zombie的原因詳解及解決方法!Linux
- MySQL併發時經典常見的死鎖原因及解決方法MySql
- 什麼是死鎖?如何解決死鎖?
- 瞭解下Mysql的間隙鎖及產生的原因MySql
- vi/vim配置篇:亂碼產生的原因及解決
- [C#.NET 拾遺補漏]12:死鎖和活鎖的發生及避免C#
- 解決Oracle死鎖問題步驟Oracle
- mysql慢查詢,死鎖解決方案MySql
- SQLserver 程式被死鎖問題解決SQLServer