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

鎖是一種機制,一直存在;死鎖是一種錯誤,儘可能避免。​html

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

一、鎖:數據庫

定義:簡單的說,鎖是數據庫爲了保證數據的一致性而存在的一種機制,其餘數據庫同樣有,只不過實現機制上可能截然不同。​併發

那麼,鎖的種類有哪些?鎖的種類有不少,根據保護的對象不一樣,Oracle數據庫鎖能夠分爲如下幾大類:DML鎖(data locks,數據鎖),用於保護數據的完整性;DDL鎖(dictionary locks,字典鎖),用於保護數據庫對象的結構,如表、索引等的結構定義;內部鎖和閂(internal locks and latches),保護 數據庫的內部結構。​oracle

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

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

二、死鎖:htm

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

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

原由: Oracle的死鎖問題實際上不多見,若是發生,基本上都是不正確的程序設計形成的,通過調整後,基本上都會避免死鎖的發生。​​

死鎖產生的緣由及四個必要條件:

產生死鎖的緣由主要是:(1) 由於系統資源不足。(2) 進程運行推動的順序不合適。(3) 資源分配不當等。若是系統資源充足,進程的資源請求都可以獲得知足,死鎖出現的可能性就很低,不然就會因爭奪有限的資源而陷入死鎖。其次,進程運行推動順序與速度不一樣,也可能產生死鎖。

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

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

 

三、鎖問題的解決:​​

產生緣由:

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

處理方法:

1)使用工具:無論任何事情提早預防老是好的,能夠用Spotlight軟件對數據庫的運行狀態進行監控。(沒用過)

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

 

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

相關文章
相關標籤/搜索