在今天的文章里,我想談下SQL Server里如何處理死鎖。當2個查詢彼此等待時會發(fā)生死鎖,沒有一個查詢可以繼續(xù)它們的操作。首先我想給你大致講下SQL Server如何處理死鎖。最后我會展示下SQL Sever里特定的死鎖類型,還有你如何避免和解決它們。
死鎖處理
死鎖的好處是SQL Server自動檢測并解決它們。為了解決死鎖,SQL Server需要回滾2個事務中最便宜的那個。在SQL Server上下文中,最便宜的事務是寫入事務日志更少字節(jié)的那個。
SQL Server在后臺進程中實現(xiàn)死鎖檢測稱為死鎖監(jiān)控(Deadlock Monitor)。這個后臺進程每5秒鐘運行一次,為死鎖檢查當前鎖定情況。在最壞的情況中,因此一個死鎖不應該超過5秒。這個查詢會回滾并收到1205錯誤號。死鎖的好事是你可以完整從錯誤情況下還原,不需要用戶的任何干預。一個聰明的開發(fā)者必須按下列步驟來從死鎖中恢復:
當異常拋出時,檢查1205錯誤號
暫時停止程序,給其他查詢時間來完成它的事務并釋放它獲得的鎖
重新提交查詢,即被SQL Server回滾的。
重新提交查詢后,這個查詢應該繼續(xù)執(zhí)行,沒有任何問題,因為其它查詢已經(jīng)完成它的事務。當然你應該保持再次發(fā)生死鎖的