oracle鎖與死鎖概念,阻塞產生的原因以及解決方案


鎖是一種機制,一直存在;死鎖是一種錯誤,盡量避免。​

首先,要理解鎖和死鎖的概念:​

1、鎖:

定義:簡單的說,鎖是數據庫為了保證數據的一致性而存在的一種機制,其他數據庫一樣有,只不過實現機制上可能大相徑庭。​

那么,鎖的種類有哪些?鎖的種類有很多,根據保護的對象不同,Oracle數據庫鎖可以分為以下幾大類:DML鎖(data locks,數據鎖),用於保護數據的完整性;DDL鎖(dictionary locks,字典鎖),用於保護數據庫對象的結構,如表、索引等的結構定義;內部鎖和閂(internal locks and latches),保護 數據庫的內部結構。​

在實際項目中遇到的最多的是DML鎖,也可進一步說是行級鎖。這些行級鎖在程序並發訪問的時候會造成程序很慢,或者直接訪問不了的情況—這種現象稱為阻塞。那么,產生阻塞的原因是什么呢?定義:當一個會話保持另一個會話正在請求的資源鎖定時,就會發生阻塞。被阻塞的會話將一直掛起,直到持有鎖的會話放棄鎖定的資源為止。四個常見的DML語句會產生阻塞:

1)INSERT 2)​UPDATE 3)DELETE ​4)SELECT…FOR UPDATE​

2、死鎖:

定義:當兩個用戶同時希望持有對方的資源時就會發生死鎖。即當兩個用戶互相等待對方釋放資源時,oracle認定產生了死鎖,在這種情況下,將以犧牲一個用戶為代價,另一個用戶繼續執行,犧牲的事物將回滾。

例子: 1:用戶1對A表進行Update,沒有提交。 2:用戶2對B表進行Update,沒有提交。 此時雙反不存在資源共享的問題。 3:如果用戶2此時對A表作update,則會發生阻塞,需要等到用戶一的事物結束。 4:如果此時用戶1又對B表作update,則產生死鎖。此時Oracle會選擇其中一個用戶進行會滾,使另一個用戶繼續執行操作。​​​

起因: Oracle的死鎖問題實際上很少見,如果發生,基本上都是不正確的程序設計造成的,經過調整后,基本上都會避免死鎖的發生。​​

死鎖產生的原因及四個必要條件:

產生死鎖的原因主要是:(1) 因為系統資源不足。(2) 進程運行推進的順序不合適。(3) 資源分配不當等。如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。

產生死鎖的四個必要條件:(1) 互斥條件:一個資源每次只能被一個進程使用。(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

死鎖的解除與預防:理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配算法,避免進程永久占據系統資源。此外,也要防止進程在處於等待狀態的情況下占用資源。因此,對資源的分配要給予合理的規划。

 

3、鎖問題的解決:​​

產生原因:

死鎖問題,oracle默認會解決,這里的鎖問題主要指的是由於數據庫鎖機制而導致的阻塞現象,或者是,在實際操作中,由於不正當操作或者程序中的bug,當程序卡在那里的時候造成的鎖表現象,或者是,事物進行回滾或者提交時發生了異常,沒有回滾成功或者提交成功,導致鎖表(這是一種真正意義的死亡,雖然不是死鎖,但是和死鎖性質一樣,甚至比死鎖更可怕)。​​​​

處理方法:

1)使用工具:不管任何事情提前預防總是好的,可以用Spotlight軟件對數據庫的運行狀態進行監控。(沒用過)

2)​針對本系統此問題的解決方案(類似情況都可以套用哈)

 

原文:http://blog.sina.com.cn/s/blog_9d12d07f0102vu72.html


免責聲明!

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



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