要想知道資料庫中的死鎖是什麼原因首先要有這個資料庫知識基礎:如果「修改」一條資料,首先資料庫管理系統會在上面加鎖,以保證在同一時間只有乙個事務能進行修改操作。鎖定發生在乙個事務獲得對某一資源的「鎖」時,這時,其他的事務就不能更改這個資源了,這種機制的存在是為了保證資料一致性。
資料庫產生死鎖的原因:
1.事務之間對資源訪問順序的交替
乙個使用者a 訪問表a(鎖住了表a),然後又訪問表b;另乙個使用者b 訪問表b(鎖住了表b),然後企圖訪問表a;這時使用者a由於 使用者b已經鎖住表b,它必須等待使用者b釋放表b才能繼續,同樣使用者b要等使用者a釋放表a才能繼續,這樣死鎖就產生了。
2.併發修改同一記錄
使用者a查詢一條紀錄,然後修改該條紀錄;這時使用者b修改該條紀錄,這時使用者a的事務裡鎖的性質由查詢的共享鎖企圖上公升到獨佔鎖,而使用者b裡的獨佔鎖由於a有共享鎖存在所以必須等a釋放掉共享鎖,而a由於b的獨佔鎖而無法上公升的獨佔鎖也就不可能釋放共享鎖,於是出現了死鎖。這種死鎖由於比較隱蔽,但在稍大點的專案中經常發生。
一般更新模式由乙個事務組成,此事務讀取記錄,獲取資源(頁或行)的共享 (s) 鎖,然後修改行,此操作要求鎖轉換為排它 (x) 鎖。如果兩個事務獲得了資源上的共享模式鎖,然後試圖同時更新資料,則乙個事務嘗試將鎖轉換為排它 (x) 鎖。共享模式到排它鎖的轉換必須等待一段時間,因為乙個事務的排它鎖與其它事務的共享模式鎖不相容;發生鎖等待。第二個事務試圖獲取排它 (x) 鎖以進行更新。由於兩個事務都要轉換為排它 (x) 鎖,並且每個事務都等待另乙個事務釋放共享模式鎖,因此發生死鎖。
3.索引不當導致全表掃瞄
如果在事務中執行了一條不滿足條件的語句,執行全表掃瞄,把行級鎖上公升為表級鎖,多個這樣的事務執行後,就很容易產生死鎖和阻塞。類似的情況還有當表中的資料量非常龐大而索引建的過少或不合適的時候,使得經常發生全表掃瞄,最終應用系統會越來越慢,最終發生阻塞或死鎖。
參考:作業系統中提到的死鎖:
死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。
產生原因:
競爭資源引起程序死鎖
可剝奪資源和不可剝奪資源
競爭不可剝奪資源
競爭臨時資源
作業系統 死鎖和死鎖處理策略
本文在作業系統的角度梳理下死鎖和作業系統的死鎖處理策略。在併發環境下,各程序因競爭資源而造成的一種互相等待對方手裡的資源,導致各程序都阻塞,都無法向前推進的現象。發生死鎖後,若無外力干涉,則這些程序都無法向前推進。互斥條件 不剝奪條件 請求和保持條件 迴圈等待條件 對不可剝奪資源的不合理分配,可能導...
作業系統死鎖
作業系統死鎖,在作業系統課程當中屬於比較關注的乙個知識點,在這裡做個簡單的梳理。死鎖的四個必要條件 作業系統中有若干程序併發執行,它們不斷申請 使用 釋放系統資源,雖然系統的進 程協調 通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能 繼續執行,否則就阻塞的情況。此時,若不借...
作業系統 死鎖
多執行緒以及多程序改善了系統資源的利用率並提高了系統 的處理能力。然而,併發執行也帶來了新的問題 死鎖。死鎖是指多個程序在執行過程中因爭奪資源而造成的一種僵局,當前程序處於這種狀態時,若無外力作用,它們都將無法再向前推進。關於死鎖的一些結論 競爭資源 當系統中供多個程序共享的資源如印表機 公用佇列等...