儲存過程編譯出現鎖死情況的解決方法

2021-09-13 14:48:17 字數 1934 閱讀 5671

先科普一下儲存過程,在專案開發過程可能會遇到。

儲存過程(stored procedure)是在大型資料庫系統中,一組為了完成特定功能的sql 語句集,儲存在資料庫中,經過第一次編譯後再次呼叫不需要再次編譯,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程帶有引數)來執行它。 儲存過程是資料庫中的乙個重要物件。

今天開發過程中,遇到之前寫好的儲存過程重新進行編譯出現鎖死的情況,於是我瞬間不淡定了。明明之前都已經寫好了呀!

在資料庫開發的過程中,經常碰到包、儲存過程、函式無法編譯或編譯時導致pl/sql無法響應的問題。碰到這種問題,基本上都要重啟資料庫解決,嚴重浪費開發時間。

從事資料庫開發的都知道鎖的概念,如:執行 update table *** where *** 的時候就會產生鎖。這種常見的鎖在oracle裡面被稱為dml鎖。在oracle中還有一種ddl鎖,主要用來保證儲存過程、表結構、檢視、包等資料庫物件的完整性,這種鎖的資訊可以在dba_ddl_locks中查到。注意:v$locked_object記錄的是dml鎖資訊,ddl鎖的資訊不在裡面。

對應ddl鎖的是ddl語句,ddl語句全稱資料定義語句(data define language)。用於定義資料的結構或schema,如:create、alter、drop、truncate、comment、rename。當我們在執行某個儲存過程、或者編譯它的時候oracle會自動給這個物件加上ddl鎖,同時也會對這個儲存過程所引用的物件加鎖。

了解了以上知識以後,我們可以得出結論:編譯包長時間無響應說明產生了死鎖。我們可以輕易的讓這種死鎖發生,舉例:

開啟乙個pl/sql,開始除錯某個函式(假設為:fun_core_servicecall),並保持在除錯狀態

開啟乙個sql window,輸入select *from dba_ddl_locks awhere a.name ='fun_core_servicecall'會發現一行記錄:

開啟乙個新的pl/sql,重新編譯這個函式。我們會發現此時已經無法響應了

回到第乙個pl/sql ,重新執行select *from dba_ddl_locks awhere a.name ='fun_core_servicecall'我們將會看到如下記錄:

上述的情況表明發生了鎖等待的情況。

在oracle中ddl鎖分為:exclusive ddl locks(排他的ddl)、share ddl locks(共享ddl鎖)、breakable parse locks(可被打破的解析鎖)幾類。篇幅所限,這裡就不再詳細介紹了。根據這個例子推理一下,當我們試圖編譯、修改儲存過程、函式、包等對資料物件的時候,如果別人也正在編譯或修改他們時就會產生鎖等待;或者我們在編譯某個儲存過程的時候,如果它所引用的資料庫物件正在被修改應該也會產生鎖等待。這種假設有興趣的兄弟可以測試下,不過比較困難。

碰到這種問題,如果知道是被誰鎖定了(可以查出來的),可以讓對方盡快把鎖釋放掉;實在查不出來只能手工將這個鎖殺掉了。

死鎖是資料庫經常發生的問題,資料庫一般不會無緣無故產生死鎖,死鎖通常都是由於我們應用程式的設計本身造成的。

產生死鎖時,如何解決呢,下面是常規的解決辦法(區分是否知道誰被鎖定):

知道死鎖物件

比如我所遇到的問題,p_reveal_report_clear_tip編譯響應失敗。

注意:p_reveal_report_clear_tip為儲存過程的名稱。發現locks=6,說明有6個死鎖sid

注意:crm_lastchginfo_day為儲存過程的名稱。查詢出對應6個的sid

不知道死鎖物件

查v$session檢視,這一步將得到paddr

再次執行儲存過程,錯誤沒有了。語句執行成功!

posted @

2019-03-11 22:17

南嶼北島 閱讀(

...)

編輯收藏

編譯出現的問題解決

知識點的補充 異常處理 1.讓乙個函式發現了自己無法處理的錯誤時throw丟擲異常。乙個庫的作者可以檢測出發生怎樣的錯誤,卻不知道如何處理 庫的使用者處理錯誤,卻無法檢測何時發生。這就需要最基本的異常檢測 2.c 中的錯誤 3.c語言使用的方法 exception logic error bad a...

Oracle儲存過程被鎖無法編譯的解決

via 儲過程被鎖無法編譯的解決 select distinct s1.from v db object cache oc,v object dependency od,dba kgllock w,v session s1 where oc.name p sps inte ce and od.to ...

DSP5509A 編譯出現的問題解決

在給搭建好的dsp開發環境寫測試 的時候編譯出現了幾個錯誤,現在把錯誤解決的方法記錄一下。1。warning stack section not found ignoring stack option 這只是乙個警告,忽視也行,但是看著不舒服,就解決了一下。解決辦法 builder option l...