數據庫--死鎖產生原因及解決方法

 數據庫與操作系統一樣,是一個多用戶使用的共享資源。當多個用戶併發地存取數據時,就會產生多個事務同時存取統一數據的情況。如果對併發操作沒有相應的控制就可能會導致讀取和存儲不正確的數據,破壞了數據庫的一致性。

   加鎖(讀鎖和寫鎖)是一種控制方法,但當兩個事務要一組有衝突的鎖,而不能將事務繼續下去的話,就會出現死鎖。

死鎖1:

用戶A訪問表A(鎖住了表A),然後又訪問表B;用戶B訪問表B,然後企圖訪問表A;這時候用戶A和B就會相互等待對方釋放原本持有的鎖,而進入僵持,也就死鎖了。

解決方法:對於多表的操作,盡力按照相同的順序進行處理,避免同時鎖定兩個資源。必須同時鎖定兩個資源時,要保證在任何時刻都應該按照想同的順序來鎖定資源。比如讓用戶A先鎖定表A再表B,那用戶B也是先鎖定表A再B。

死鎖2:

用戶A查詢一條記錄,然後修改這條記錄;這時用戶B修改這條記錄。 用戶A的事務裏鎖從查詢的共享鎖企圖上升到獨佔鎖,而用戶B裏的獨佔鎖由於A有共享鎖存在所以必須等A釋放掉共享鎖,但A由於B的獨佔鎖無法上鎖到獨佔鎖也就不可能釋放共享鎖,於是就出現了死鎖。

解決方法:1.避免同時對同一條記錄操作。

2.使用樂觀鎖(基於數據版本記錄機制)控制。

3.使用悲觀鎖控制(開銷比較大)。

死鎖3:

如果在事務中執行了一條不滿足條件的update語句,則執行全表掃描,把行級鎖上升爲表級鎖,多個這樣的事務執行後,很容易產生死鎖和阻塞。當表中的數據量非常大而所以建的過少或不合適時候,也會經常發生全表掃描,出現類似情況。

解法方法:SQL語句中不要使用太複雜的關聯多表的查詢,使用“explain”對SQL語句進行分析,對於全表掃描的SQL語句,建立相應的索引進行優化。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章