SQL Server 死鎖檢測(cè)與結(jié)束死鎖
以下的文章主要向大家講述的是SQL Server 死鎖檢測(cè)與結(jié)束死鎖得實(shí)際操作過(guò)程,我們大家都知道在 Microsoft® SQL Server™ 2000 數(shù)據(jù)庫(kù)中,單個(gè)用戶(hù)會(huì)話(huà)都可能有一個(gè)或多個(gè)代表它運(yùn)行的線(xiàn)程。每個(gè)線(xiàn)程可能獲取或等待獲取各種資源,如:
鎖。
與并行查詢(xún)執(zhí)行相關(guān)的資源(與交換端口相關(guān)聯(lián)的處理協(xié)調(diào)器、發(fā)生器和使用者線(xiàn)程)。
線(xiàn)程。
內(nèi)存。
上述這些資源除內(nèi)存外都參與 SQL Server 死鎖檢測(cè)方案。對(duì)于內(nèi)存,SQL Server 使用基于超時(shí)的機(jī)制,該機(jī)制由 sp_configure 中的 query wait 選項(xiàng)控制。
在 SQL Server 2000 中,SQL Server 死鎖檢測(cè)由一個(gè)稱(chēng)為鎖監(jiān)視器線(xiàn)程的單獨(dú)的線(xiàn)程執(zhí)行。在出現(xiàn)下列任一情況時(shí),鎖監(jiān)視器線(xiàn)程對(duì)特定線(xiàn)程啟動(dòng)死鎖搜索:
·線(xiàn)程已經(jīng)為同一資源等待了一段指定的時(shí)間。鎖監(jiān)視器線(xiàn)程定期醒來(lái)并識(shí)別所有等待某個(gè)資源的線(xiàn)程。如果鎖監(jiān)視器再次醒來(lái)時(shí)這些線(xiàn)程仍在等待同一資源,則它將對(duì)等待線(xiàn)程啟動(dòng)鎖搜索。
·線(xiàn)程等待資源并啟動(dòng)急切的死鎖搜索。
SQL Server 通常只執(zhí)行定期死鎖檢測(cè),而不使用急切模式。因?yàn)橄到y(tǒng)中遇到的死鎖數(shù)通常很少,定期死鎖檢測(cè)有助于減少系統(tǒng)中死鎖檢測(cè)的開(kāi)銷(xiāo)。
當(dāng)鎖監(jiān)視器對(duì)特定線(xiàn)程啟動(dòng)SQL Server 死鎖檢測(cè)時(shí),它識(shí)別線(xiàn)程正在等待的資源。然后,鎖監(jiān)視器查找特定資源的擁有者,并遞歸地繼續(xù)執(zhí)行對(duì)那些線(xiàn)程的死鎖搜索,直到找到一個(gè)循環(huán)。用這種方式識(shí)別的循環(huán)形成一個(gè)死鎖。
在識(shí)別死鎖后,SQL Server 通過(guò)自動(dòng)選擇可以打破死鎖的線(xiàn)程(死鎖犧牲品)來(lái)結(jié)束死鎖。SQL Server 回滾作為死鎖犧牲品的事務(wù),通知線(xiàn)程的應(yīng)用程序(通過(guò)返回 1205 號(hào)錯(cuò)誤信息),取消線(xiàn)程的當(dāng)前請(qǐng)求,然后允許不間斷線(xiàn)程的事務(wù)繼續(xù)進(jìn)行。
SQL Server 通常選擇運(yùn)行撤消時(shí)花費(fèi)最少的事務(wù)的線(xiàn)程作為死鎖犧牲品。另外,用戶(hù)可以使用 SET 語(yǔ)句將會(huì)話(huà)的 DEADLOCK_PRIORITY 設(shè)置為 LOW。DEADLOCK_PRIORITY 選項(xiàng)控制在死鎖情況下如何衡量會(huì)話(huà)的重要性。如果會(huì)話(huà)的設(shè)置為 LOW ,則當(dāng)會(huì)話(huà)陷入死鎖情況時(shí)將成為***犧牲品。
識(shí)別死鎖:識(shí)別死鎖后,SQL Server 選擇特定的線(xiàn)程作為死鎖犧牲品,并返回一條列出死鎖中涉及的資源的錯(cuò)誤信息。該死鎖信息采用下列形式:
Your transaction (process ID #52) was deadlocked>死鎖中涉及的線(xiàn)程和資源位于錯(cuò)誤日志中。
以上的相關(guān)內(nèi)容就是對(duì)SQL Server 死鎖檢測(cè)和結(jié)束死鎖的介紹,望你能有所收獲。
【編輯推薦】
- SQL Server 2000 數(shù)據(jù)庫(kù)的版本有哪些?
- SQL Server 2000中頻繁出現(xiàn)的7個(gè)問(wèn)題
- 是SQL Server 瀏覽器的實(shí)際工作原理描述
- SQL Server 瀏覽器的正確應(yīng)用
- SQL Server刪除群集的實(shí)例演示