關於死鎖產生的原因以及解決的辦法

2021-06-04 16:07:22 字數 1247 閱讀 9116

事實上圖靈已經證明死鎖問題無法避免(當然包括資料爭奪),只能盡可能地減小死鎖的發生

死鎖和資料爭奪只能盡量避免

一般來說,如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。

另外死鎖有4個必要條件(要發生缺一不可)

(1) 互斥條件:乙個資源每次只能被乙個程序使用。

(2) 請求與保持條件:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。

(3) 不剝奪條件:程序已獲得的資源,在末使用完之前,不能強行剝奪。

(4) 迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

通過使用較好的資源分配演算法,就可以盡可能地破壞死鎖的必要條件,從而盡可能地避免死鎖 。

下列方法有助於最大限度地降低死鎖:    

1 、按同一順序訪問物件。  

如果所有併發事務按同一順序訪問物件,則發生死鎖的可能性會降低。例如,如果兩個併發事務獲得   supplier   表上的鎖,然後獲得   part   表上的鎖,則在其中乙個事務完成之前,另乙個事務被阻塞在   supplier   表上。第乙個事務提交或回滾後,第二個事務繼續進行。不發生死鎖。將儲存過程用於所有的資料修改可以標準化訪問物件的順序  

2、避免事務中的使用者互動。  

避免編寫包含使用者互動的事務,因為執行沒有使用者互動的批處理的速度要遠遠快於使用者手動響應查詢的速度,例如答覆應用程式請求引數的提示。例如,如果事務正在等待使用者輸入,而使用者去吃午餐了或者甚至回家過週末了,則使用者將此事務掛起使之不能完成。這樣將降低系統的吞吐量,因為事務持有的任何鎖只有在事務提交或回滾時才會釋放。即使不出現死鎖的情況,訪問同一資源的其它事務也會被阻塞,等待該事務完成。  

3、保持事務簡短並在乙個批處理中。  

在同一資料庫中併發執行多個需要長時間執行的事務時通常發生死鎖。事務執行時間越長,其持有排它鎖或更新鎖的時間也就越長,從而堵塞了其它活動並可能導致死鎖。保持事務在乙個批處理中,可以最小化事務的網路通訊往返量,減少完成事務可能的延遲並釋放鎖  

4、使用低隔離級別。  

確定事務是否能在更低的隔離級別上執行。執行提交讀允許事務讀取另乙個事務已讀取(未修改)的資料,而不必等待第乙個事務完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可序列讀)可以縮短持有共享鎖的時間,從而降低了鎖定爭奪  

5、使用繫結連線。  

使用繫結連線使同一應用程式所開啟的兩個或多個連線可以相互合作。次級連線所獲得的任何鎖可以象由主連線獲得的鎖那樣持有,反之亦然,因此不會相互阻塞。

MySQL死鎖的產生原因以及解決方案

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

死鎖的概念以及產生死鎖的原因

在多道程式系統中,由於多個程序的併發執行,改善了系統資源的利用率並提高了系統 的處理能力。然而,多個程序的併發執行也帶來了新的問題 死鎖。所謂死鎖是指多個進 程因競爭資源而造成的一種僵局 互相等待 若無外力作用,這些程序都將無法向前推進。下面我們通過一些例項來說明死鎖現象。先看生活中的乙個例項,在一...

死鎖產生的原因

一 什麼是死鎖?如果乙個程序集合裡面的每個程序都在等待這個集合中的其他乙個程序 包括自身 才能繼續往下執行,若無外力他們將無法推進,這種情況就是死鎖,處於死鎖狀態的程序稱為死鎖程序 二 死鎖產生的原因?1.因競爭資源發生死鎖 現象 系統中供多個程序共享的資源的數目不足以滿足全部程序的需要時,就會引起...