死鎖是由兩個相互阻塞的線程組成,它們互相等待對方完成,一般死鎖情況下兩個數據庫事務之間存在著相反的操作。sqlserver中死鎖監視器定時檢查死鎖,如果發現死鎖,將選擇其中回滾消耗最小的任務,這時候發生1025數據庫錯誤。可以通過啟用sqlserver2005快照模式,避免一些讀/寫的逆向阻塞造成的死鎖.但是對於一些寫/寫阻塞的死鎖可能無法解決,很多時候需要從業務的角度來避免一些寫/寫的逆向操作阻塞情況。
死鎖問題的解決很困難,但是可以通過一些手段來使死鎖最小化。
從理論上講,數據庫死鎖無法避免,但是可以遵循一定原則使死鎖發生的概率盡量降低。
*用相同的順序訪問對象,如果涉及到多於一張表的操作,要保證事務中都按照相同的順序訪問這些表。
*減少一個事務中的大批量更新的操作,大批量操作寫操作涉及記錄獨占鎖太多而且一直到事務結束才能釋放,更容易與其它事務造成死鎖。
*去掉讀操作的共享鎖
最佳方式是使用sql2005的快照模式,其次方式是使用讀未提交隔離模式或使用NOLock提示,需要平台和業務設計時依據情況進行sql組織的設計。
按照相同的順序訪問對象可以避免相互持有對方請求資源的情況發生。例如一個操作主從表的處理流程,涉及查詢和修改兩個步驟。如果查詢時是先查主表再查從表,則修改也應先修改主表再修改從表。
另一個降低事務大小的一個主要手段,是將查詢操作盡可能地提前(包括使用一些中間變量記錄下查詢結果提供後續使用),而把插入、修改等操作集中在方法靠後的部分。這樣,可以讓一個事務需要持有獨占鎖的時間盡可能縮短,減少死鎖的發生概率。