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