程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle死鎖,oracle

Oracle死鎖,oracle

編輯:Oracle教程

Oracle死鎖,oracle


當兩個或多個用戶相互等待鎖定的數據時就會發生死鎖,這時這些用戶被卡在不能繼續處理業務,oracle可以自動檢測死鎖並解決他們,通過回滾一個死鎖中的語句,釋放鎖定的數據,回滾的話會遇到ora-00060 deadlock detected while waiting for resource

oracle編程藝術上面提過,死鎖的兩種原因:外鍵未加索引,位圖索引並發。

外鍵無索引導致死鎖:

oracle在更新主表的時候,會去尋找所有以主表的主鍵作為外鍵的數據表,然後看從表是否有該外鍵的索引,如果沒有則會對整個從表施加表級鎖,然後對從表進行全表掃描。當然如果從表存在外鍵的索引,會去訪問對應的索引,而不會對從表本身進行加鎖。

位圖索引並發導致死鎖:

位圖索引主要針對大量相同值的列而創建(例如:類別,操作員,部門ID,庫房ID等),
索引塊的一個索引行中存儲鍵值和起止Rowid,以及這些鍵值的位置編碼,
位置編碼中的每一位表示鍵值對應的數據行的有無.一個位圖索引塊可能指向的是幾十甚至成百上千行數據的位置.

創建語法很簡單,就是在普通索引創建的語法中index前加關鍵字bitmap即可,例如:
create bitmap index H病人掛號記錄_ix_執行人 on H病人掛號記錄(執行人);

位圖索引由於用位圖反映數據,不同會話更新相同鍵值的同一位圖段,insert、update、delete相互操作都會發鎖定。

另外,自治事務也可能會引起死鎖。

死鎖處理。

查看鎖表進程

select l.os_user_name, l.oracle_username, object_name, o.object_type,
       o.created, s.program, s.sid, s.serial#, p.spid
  from v$locked_object l, dba_objects o, v$session s, v$process p
where l.object_id = o.object_id
   and l.session_id = s.sid
   and s.paddr = p.addr;

殺掉鎖表進程方法一:

alter system kill session 'sid,serial#';

如果利用上面的殺掉鎖表進程方法一殺死一個進程後,進程狀態被置為"killed",但是鎖定的資源很長時間沒有被釋放,那麼可以在os一級再殺死相應的進程(線程),首先執行下面的語句獲得進程(線程)號:
select spid, osuser, s.program
from v$session s,v$process p
where s.paddr=p.addr and s.sid=234 (234是上面的sid)
在OS上殺死這個進程(線程):
1)在unix上,用root身份執行命令:
#kill -9 12345(即第3步查詢出的spid)
2)在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個可執行命令,語法為:
orakill sid thread
其中:
sid:表示要殺死的進程屬於的實例名
thread:是要殺掉的線程號,即第3步查詢出的spid。
例:c:>orakill orcl 12345

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved