前言
作為一個用oracle程式設計的人,你不可能沒有碰到過
死鎖
。當碰上
死鎖時,程式設計師就和資料庫管理員DBA相互爭論
,我說是你的問題,你說我你的問題,其實都是大家的問題。
有些程式設計師碰到死鎖就驚慌失措,首先要冷靜
為什麼會產生死鎖?
這裡不探討高深的概念的東西,網上有很多這種解釋的例子,但是要麼執行不了,要麼少一個標點符號,要麼少個字母,亂七八糟的。
站在使用者的層面,死鎖就是是Oracle操指令update,insert,delete沒有及時處理提交造成。
例如使用者A更改訂單B,使用者C也更改訂單B。如果使用者A修改後沒有及時的提交,使用者C修改B的時候就會死鎖。
因此Oracle的死鎖99%是因為程式設計師的程式碼寫的不好造成,但資料庫管理員在排查的時候,也只能把死鎖幹掉,沒辦法幫程式設計師在程式碼裡排查哪些程式碼造成死鎖的。
那有沒有什麼辦法向這個目標靠攏?如果有就可以通知程式設計師將排查範圍大大縮小,皆大歡喜
。
沒有DBA也能解決問題
查出來哪些oracle執行緒的死鎖。
SELECT s。MACHINE AS “機器名”,s。username as “資料庫使用者”, l。ORACLE_USERNAME AS “資料庫使用者
名”,l。OS_USER_NAME AS “作業系統使用者”,l。PROCESS AS “資料執行緒號”,C。SID AS “ORAKILL號”,
l。SESSION_ID AS “SESSION_ID”,s。SERIAL# AS “SERIAL”,S。sql_hash_value FROM
V$LOCKED_OBJECT l,V$SESSION S,(select spid,S。SID from v$session s,v$process p where s。paddr=p。addr
) C
WHERE l。SESSION_ID=S。SID
AND l。SESSION_ID=C。SID(+)
以上指令碼直接執行就可以了,沒有任何錯誤(真正的乾貨)
。
2。殺掉死鎖
在幹掉死鎖的時候要注意,根據上面的圖形排查計算機的名字(事先計算機名字已經傳存檔),然後叫他們安全退出來,或者根據計算機名字所在的辦公範圍通知他們安全退出。
根據計算機名稱對應操作人員範圍,程式設計師就可以知道哪些功能是被操作,這時候程式設計師就可以將寵大的系統程式碼定位在某個功能模組上排查
,大大提高效率。
當然,如果你有100%的把握知道哪個功能造成死鎖,可以直接殺掉,所有的oracle事務回滾
。
以下是殺掉死鎖的指令。
alter system kill session ‘SESSION_ID,SERIAL’
注意!上面的符號不能出錯,【SESSION_ID】、【SERIAL】是上一個語句顯示出來的值。
還有一點很重要,登入的使用者必須有DBA管理員許可權。
冷靜是解決問題的基本要素
至此就可以實現程式設計來處理oracle死鎖的問題。