1. 程式人生 > >Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法

Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法

一.表加鎖、死鎖出現的現象
1.對資料庫操作update,insert,delete時候,資料庫無法更新,操作等待時長,操作結果不發生改變
2.在程式中,底層(資料訪問層)操作時候,不成功,資料庫連線超時,無法操作,或者操作等待時長等現象
【加鎖的原理】:比如一個操作在進行修改一表,它沒完成,另一個操作也操作這張表時候就需要等待,
前面操作結束之後才可進行操作

二.表加鎖、導致死鎖原因
1.可能在Oracle中可以有計時器,在頻繁操作資料庫,update,insert,delete語句,在jobs中能檢視到(如圖)
【ORACLE】Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法
2.可能在.net程式中使用到timer控制元件,頻繁的操作資料庫update,insert,delete語句(如圖)
【ORACLE】Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法

3.可能在.net程式中使用到Thead(執行緒)頻繁的操作資料庫update,insert,delete語句(這個條為個人觀點,還未得到證實)
【註釋】:此處更新資料量都比較大,比如說update的資料庫條數可能在1000條以上,
導致其他操作在等待(update跟其他操作都是同一張表)

4.可能使用到事務處理(Tran),沒有提交事務(CommintTran)或者沒有回滾事務(Rollback)
【註釋】:在SqlServer資料庫裡面有一個隱式事務,關閉時候,每次修改插入都需要手動提交,不然就會導致死鎖
三.解決方法
1.解決方案一
//檢視所有被加鎖的資訊
select * from v$locked_object;
【ORACLE】Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法

//檢視加鎖的Session_id編號
select b.owner,b.object_name,a.session_id,a.locked_mode from vlocked_object a,dba_objects b   where b.object_id = a.object_id;  
【ORACLE】Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法  
//獲取sid,serial#進行解鎖操作  
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;
【ORACLE】Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法
//解鎖操作
alter system kill session’sid,serial#’;
【註釋】:1.sid和serial#都是由上查詢到的
2.資料庫頻繁在加鎖、解鎖,可能在在用sql解鎖的時候,sid,serial#就被資料庫自動解鎖了
3.手動解鎖,無法解決死鎖問題

2.解決方案二
//查詢導致死鎖的使用者和軟體還有T-SQL語句,記錄時間、計算機名稱
select username,sql_text,lockwait,status,machine,program,logon_time from v session,v sql where v session.SQLID=v sql.SQL_ID 、
order by logon_time desc【ORACLE】Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法【註釋】:通過sql_Text列,您可以檢視到被鎖定的表是誰

//通過修改計時器間隔時間來解決
【ORACLE】Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法

//修改Timer控制元件間隔執行時間
【ORACLE】Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法

//執行緒,還未證實如何修改