oracle中表加鎖死鎖的現象、原因及解決方案


一、表加鎖、死鎖出現的現象

 1、對數據庫操作update、insert、delete時候,數據庫無法更新,操作等待時長,操作結果不發生改變;
 2、在程序中,底層(數據訪問層)操作時候不成功,數據庫連接超時,無法操作,或者操作等待時長等現象。
 加鎖原理:如果一個操作在進行修改一表,它沒完成,另一個操作也操作這張表時候就需要等待,前面操作結束之后才可進行操作。

二、表加鎖、導致死鎖原因

1、可能在Oracle中可以有計時器,在頻繁操作數據庫update、insert、delete語句。

 

2、可能在.net程序中使用到timer控件,頻繁地操作數據庫update、insert、delete語句。 

3、可能使用到事務處理(Tran),沒有提交事務(CommintTran)或者沒有回滾事務(Rollback)

【注釋】:在SqlServer數據庫里面有一個隱式事務,關閉時候,每次修改插入都需要手動提交,不然就會導致死鎖。 

三、解決方案

步驟為:
1、執行下面SQL,先查看哪些表被鎖住了:
select 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;
 
2、查處引起死鎖的會話
 select b.username,b.sid,b.serial#,logon_time  from v$locked_object a,v$session b   where a.session_id = b.sid order by b.logon_time;
 這里會列出SID
SELECT s.username, l.OBJECT_ID, l.SESSION_ID, s.SERIAL#,  l.ORACLE_USERNAME, l.OS_USER_NAME, l.PROCESS  FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;  
 
3、 查出SID和SERIAL#:
查V$SESSION視圖:
SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='剛才查到的SID';
這一步將得到PADDR
 
4、查V$PROCESS視圖:
SELECT SPID FROM V$PROCESS WHERE ADDR='剛才查到的PADDR';
這一步得到SPID
 
5、殺掉進程 sid,serial#,這里的兩個數是根據數據庫查詢得到的
alter system kill session'210,11562';
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM