今天給各位分享預防死鎖的知識,其中也會對可以采用一次性請求所有資源來預防死鎖進行解釋,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在開始吧!
怎么避免死鎖什么是死鎖,如何避免死鎖?
線程A需要資源X,而線程B需要資源Y,而雙方都掌握有對方所要的資源,這種情況稱為死鎖(deadlock),或死亡擁抱(the deadly embrace) 。
在并發程序設計中,死鎖 (deadlock) 是一種十分常見的邏輯錯誤 。通過采用正確的編程方式,死鎖的發生不難避免 。
死鎖的四個必要條件
------------------------------
在計算機專業的本科教材中,通常都會介紹死鎖的四個必要條件 。這四個條件缺一不可,或者說只要破壞了其中任何一個條件,死鎖就不可能發生 。我們來復習一下,這四個條件是:
互斥(Mutual exclusion):存在這樣一種資源,它在某個時刻只能被分配給一個執行緒(也稱為線程)使用;
持有(Hold and wait):當請求的資源已被占用從而導致執行緒阻塞時,資源占用者不但無需釋放該資源,而且還可以繼續請求更多資源;
不可剝奪(No preemption):執行緒獲得到的互斥資源不可被強行剝奪,換句話說,只有資源占用者自己才能釋放資源;
環形等待(Circular wait):若干執行緒以不同的次序獲取互斥資源,從而形成環形等待的局面,想象在由多個執行緒組成的環形鏈中,每個執行緒都在等待下一個執行緒釋放它持有的資源 。
解除死鎖的必要條件
不難看出,在死鎖的四個必要條件中,第二、三和四項條件比較容易消除 。通過引入事務機制,往往可以消除第二、三兩項條件,方法是將所有上鎖操作均作為事務對待,一旦開始上鎖,即確保全部操作均可回退,同時通過鎖管理器檢測死鎖,并剝奪資源(回退事務) 。這種做法有時會造成較大開銷,而且也需要對上鎖模式進行較多改動 。
消除第四項條件是比較容易且代價較低的辦法 。具體來說這種方法約定:上鎖的順序必須一致 。具體來說,我們人為地給鎖指定一種類似“水位”的方向性屬性 。無論已持有任何鎖,該執行緒所有的上鎖操作,必須按照一致的先后順序從低到高(或從高到低)進行,且在一個系統中,只允許使用一種先后次序 。
請注意,放鎖的順序并不會導致死鎖 。也就是說,盡管按照 鎖A, 鎖B, 放A, 放B 這樣的順序來進行鎖操作看上去有些怪異,但是只要大家都按先A后B的順序上鎖,便不會導致死鎖 。
解決方法:
1 使用事務時,盡量縮短事務的邏輯處理過程,及早提交或回滾事務; (細化處理邏輯,執行一段邏輯后便回滾或者提交,然后再執行其它邏輯,直到事物執行完畢提交)
2 設置死鎖超時參數為合理范圍,如:3分鐘-10分種;超過時間,自動放棄本次操作,避免進程懸掛;
3 優化程序,檢查并避免死鎖現象出現;
4 .對所有的腳本和SP都要仔細測試,在正是版本之前 。
5 所有的SP都要有錯誤處理(通過@error)
6 一般不要修改SQL SERVER事務的默認級別 。不推薦強行加鎖
另外參考的解決方法:
按同一順序訪問對象
如果所有并發事務按同一順序訪問對象,則發生死鎖的可能性會降低 。例如,如果兩個并發事務獲得 Supplier 表上的鎖,然后獲得 Part 表上的鎖,則在其中一個事務完成之前,另一個事務被阻塞在 Supplier 表上 。排名個事務提交或回滾后,第二個事務繼續進行 。不發生死鎖 。將存儲過程用于所有的數據修改可以標準化訪問對象的順序 。
- 產婦月子薏仁飯的做法 產婦月子里可以吃薏米粥嗎
- 如何預防老年人骨折 老年人骨折如何緊急處理
- 產婦能吃蔥嗎月子期間 產婦坐月子期間可以吃蔥嗎?
- 預防高血壓的蔬菜水果 預防高血壓的蔬菜水果有什么
- 預防針打錯了會怎么樣 寶寶預防針打錯了會怎么樣
- 女性個人護理可以用嗎 女生需不需要經常用私護
- 女性更年期年齡及預防的簡單介紹
- 廣西中小學生預防溺水 廣西學校安全教育平臺預防溺水教育
- 機械傷害預防措施 機械傷害預防措施試題
- 預防針可以換地方打嗎 預防針可以換地方打嗎疫苗
