儘管死鎖不能完全避免,但遵守特定的編碼慣例可以將發生死鎖的機會降至最低。將死鎖減至最少可以增加事務的吞吐量並減少系統開銷,因為只有很少的事務:
下列方法有助於將死鎖減至最少:
使用繫結連線。
按同一順序訪問物件
如果所有併發事務按同一順序訪問物件,則發生死鎖的可能性會降低。例如,如果兩個併發事務獲得 supplier 表上的鎖,然後獲得 part 表上的鎖,則在其中乙個事務完成之前,另乙個事務被阻塞在 supplier 表上。第乙個事務提交或回滾後,第二個事務繼續進行。不發生死鎖。將儲存過程用於所有的資料修改可以標準化訪問物件的順序。
避免事務中的使用者互動
避免編寫包含使用者互動的事務,因為執行沒有使用者互動的批處理的速度要遠遠快於使用者手動響應查詢的速度,例如答覆應用程式請求引數的提示。例如,如果事務正在等待使用者輸入,而使用者去吃午餐了或者甚至回家過週末了,則使用者將此事務掛起使之不能完成。這樣將降低系統的吞吐量,因為事務持有的任何鎖只有在事務提交或回滾時才會釋放。即使不出現死鎖的情況,訪問同一資源的其它事務也會被阻塞,等待該事務完成。
保持事務簡短並在乙個批處理中
在同一資料庫中併發執行多個需要長時間執行的事務時通常發生死鎖。事務執行時間越長,其持有排它鎖或更新鎖的時間也就越長,從而堵塞了其它活動並可能導致死鎖。保持事務在乙個批處理中,可以最小化事務的網路通訊往返量,減少完成事務可能的延遲並釋放鎖。
使用低隔離級別
確定事務是否能在更低的隔離級別上執行。執行提交讀允許事務讀取另乙個事務已讀取(未修改)的資料,而不必等待第乙個事務完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可序列讀)可以縮短持有共享鎖的時間,從而降低了鎖定爭奪。
使用繫結連線
使用繫結連線使同一應用程式所開啟的兩個或多個連線可以相互合作。次級連線所獲得的任何鎖可以象由主連線獲得的鎖那樣持有,反之亦然,因此不會相互阻塞。
手寫乙個死鎖,避免死鎖的幾個常見方法
public class deadlockdemo private static void deadlock catch interruptedexception e synchronized b thread t2 new thread new runnable t1.start t2.start...
DEVEXPRESS 破解方法
devexpress 是.net的乙個非常好用的外掛程式。能夠輕鬆的幫你實現乙個非常炫的ui,無論是c 的winform還是asp.net的 破解所需要的工具在這裡 前提 在進行一下一些列操作之前已經安裝了devexpress 11.1.4 軟體並且保重visual studio開發工具未開啟 我所...
mac version破解方法
引用 versions for mac可以說是mac下最好用的svn客戶端了,對於mac使用者來說,svn的知名客戶端tortoisesvn只支援windows系統,讓人不免失望,因此versions就是目前mac os最好的svn客戶端。versions在使用上非常的簡單,支援資源庫的瀏覽 che...