資料庫與作業系統一樣,是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料時,就會產生多個事務同時訪問統一資料的情況。如果對併發操作沒有相應的控制就可能會導致讀取和儲存不正確的資料,破壞了資料庫的一致性。
加鎖(讀鎖和寫鎖)是一種控制方法,但當兩個事務要一組有衝突的鎖,而不能將事務繼續下去的話,就會出現死鎖。
死鎖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語句,建立相應的索引進行優化。
死鎖產生原因及解決方法
死鎖 執行緒級 死鎖是指兩個或兩個以上的執行緒在執行過程中,由於競爭資源而造成的一種阻塞的現象 產生的4個條件 1 互斥使用 即乙個執行緒在使用時,另外執行緒不可使用 2 不可搶占資源 資源請求者不能強制從資源佔有者手中奪取資源 3 占有且等待 當前執行緒在請求其他資源時,保持對原有資源占有 4 迴...
死鎖的產生條件及解決方法
產生死鎖的原因主要是 1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則 就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。產生死鎖的四個必要條件 1 互斥條件 乙個資源...
mysql資料庫死鎖的產生原因及解決辦法
資料庫和作業系統一樣,是乙個多使用者使用的共享資源。當多個使用者併發地訪問資料 時,在資料庫中就會產生多個事務同時訪問同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫並 發控制的乙個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當...