可能形成資料庫死鎖的原因以及如何能避免死鎖

2022-07-12 05:06:13 字數 1047 閱讀 5891

死鎖在作業系統中指的是兩個或兩個以上的程序在執行的過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或者系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。

在作業系統中,死鎖的處理是乙個重要的話題。

資料庫中常見的死鎖原因與解決方案有:

事務之間對資源訪問順序的交替

出現原因:

乙個使用者a 訪問表a(鎖住了表a),然後又訪問表b;另乙個使用者b 訪問表b(鎖住了表b),然後企圖訪問表a;這時使用者a由於使用者b已經鎖住表b,它必須等待使用者b釋放表b才能繼續,同樣使用者b要等使用者a釋放表a才能繼續,這就死鎖就產生了。

解決方法:

這種死鎖比較常見,是由於程式的bug產生的,除了調整的程式的邏輯沒有其它的辦法。仔細分析程式的邏輯,對於資料庫的多表操作時,盡量按照相同的順序進行處理,盡量避免同時鎖定兩個資源,如操作a和b兩張表時,總是按先a後b的順序處理, 必須同時鎖定兩個資源時,要保證在任何時刻都應該按照相同的順序來鎖定資源

併發修改同一記錄

出現原因:主要是由於沒有一次性申請夠許可權的鎖導致的。

使用者a查詢一條紀錄,然後修改該條紀錄;這時使用者b修改該條紀錄,這時使用者a的事務裡鎖的性質由查詢的共享鎖企圖上公升到獨佔鎖,而使用者b裡的獨佔鎖由於a有共享鎖存在所以必須等a釋放掉共享鎖,而a由於b的獨佔鎖而無法上公升的獨佔鎖也就不可能釋放共享鎖,於是出現了死鎖。這種死鎖比較隱蔽,但在稍大點的專案中經常發生。

解決方法:

索引不當導致的死鎖

出現原因:

如果在事務中執行了一條不滿足條件的語句,執行全表掃瞄,把行級鎖上公升為表級鎖,多個這樣的事務執行後,就很容易產生死鎖和阻塞。類似的情況還有當表中的資料量非常龐大而索引建的過少或不合適的時候,使得經常發生全表掃瞄,最終應用系統會越來越慢,最終發生阻塞或死鎖。

另外一種情況是由於二級索引的存在,上鎖的順序不同導致的,這部分在討論索引時會提到。參考:

解決方法:

sql語句中不要使用太複雜的關聯多表的查詢;使用「執行計畫」對sql語句進行分析,對於有全表掃瞄的sql語句,建立相應的索引進行優化。

那麼,如何盡可能的避免死鎖呢?

讀取Excel中的資料形成資料庫的插入指令碼

由於是2007版本的excel,即.xlxs字尾,需要使用的jar包為 org.apache.poi poi3.17 org.apache.poi poi ooxml 3.17 複製 解析的工具類是網上找的,處理單元格中增加了日期和處理科學計數法等 下邊直接上 public class import...

資料庫死鎖的解釋?以及什麼是死鎖

color red 什麼是資料庫死鎖 每個使用關係型資料庫的程式都可能遇到資料死鎖的情況。理解什麼是死鎖之前先要了解鎖定的概念 如果需要 修改 一條資料,首先資料庫管理系統會在上面加鎖,以保證在同一時間只有乙個事務能進行修改操作。鎖定 locking 發生在當乙個事務獲得對某一資源的 鎖 時,這時,...

資料庫常見死鎖原因及處理

資料庫是乙個多使用者使用的共享資源,當多個使用者併發地訪問資料時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫併發控制的乙個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當兩個事務需要一組有衝...