一、死鎖的四個必要條件
1、互斥條件(mutual exclusion):資源不能被共享,只能由乙個程序使用。
2、請求與保持條件(hold and wait):已經得到資源的程序可以再次申請新的資源。
3、非剝奪條件(no pre-emption):已經分配的資源不能從相應的程序中被強制地剝奪。
4、迴圈等待條件(circular wait):系統中若干程序組成環路,該環路中每個程序都在等待相鄰程序正占用的資源。
二、 避免死鎖
1、按同一順序訪問物件
如果所有併發事務按同一順序訪問物件,則發生死鎖的可能性會降低。例如,如果兩個併發事務獲得supplier表上的鎖,然後獲得part表上的鎖,則在其中乙個事務完成之前,另乙個事務被阻塞在supplier表上。第乙個事務提交或回滾後,第二個事務繼續進行。不發生死鎖。將儲存過程用於所有的資料修改可以標準化訪問物件的順序。
2、避免事務中的使用者互動
避免編寫包含使用者互動的事務,因為執行沒有使用者互動的批處理的速度要遠遠快於使用者手動響應查詢的速度,例如答覆應用程式請求引數的提示。例如,如果事務正在等待使用者輸入,而使用者去吃午餐了或者甚至回家過週末了,則使用者將此事務掛起使之不能完成。這樣將降低系統的吞吐量,因為事務持有的任何鎖只有在事務提交或回滾時才會釋放。即使不出現死鎖的情況,訪問同一資源的其它事務也會被阻塞,等待該事務完成。
3、保持事務簡短並在乙個批處理中
在同一資料庫中併發執行多個需要長時間執行的事務時通常發生死鎖。事務執行時間越長,其持有排它鎖或更新鎖的時間也就越長,從而堵塞了其它活動並可能導致死鎖。
保持事務在乙個批處理中,可以最小化事務的網路通訊往返量,減少完成事務可能的延遲並釋放鎖。
4、使用低隔離級別
確定事務是否能在更低的隔離級別上執行。執行提交讀允許事務讀取另乙個事務已讀取(未修改)的資料,而不必等待第乙個事務完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可序列讀)可以縮短持有共享鎖的時間,從而降低了鎖定爭奪。
5、使用繫結連線
使用繫結連線使同一應用程式所開啟的兩個或多個連線可以相互合作。次級連線所獲得的任何鎖可以象由主連線獲得的鎖那樣持有,反之亦然,因此不會相互阻塞
6、select語句加with(nolock)提示
預設情況下select語句會對查詢到的資源加s鎖(共享鎖),s鎖與x鎖(排他鎖)不相容;但加上with(nolock)後,select不對查詢到的資源加鎖(或者加sch-s鎖,sch-s鎖可以與任何鎖相容);從而可以是這兩條sql可以併發地訪問同一資源。當然,此方法適合解決讀與寫併發死鎖的情況,但加with(nolock)可能會導致髒讀。
三、程式**中加鎖
lock(引用型別的例項){};
不可以使用值型別,因為對值型別裝箱時產生的引用位址是隨機的,起不到加鎖的目的
資料庫死鎖
1.死鎖的概念 死鎖是程序死鎖的簡稱,是由dijkstra於1965年研究銀行家演算法時首先提出來的。它是計算機作業系統乃至併發程式設計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統中存在,在我們日常生活中它也廣泛存在。我們先看看這樣乙個生活中的例子 在一條河上有一座橋,橋面較窄,只能容納一...
資料庫死鎖
資料庫在進行insert,update,delete這些更新操作的時候為了保證資料一致性都會使用排他鎖。乙個事務裡進行update操作,在事務結束之前 commit or rollback 排他鎖不會被釋放。因此在乙個事務裡update多條資料的時候執行順序就尤為重要,兩個併發事務中更新操作的執行順...
資料庫死鎖
死鎖 所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序 由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的...