SQL Server裡如何處理死鎖

2021-09-22 07:00:33 字數 1650 閱讀 5277

在今天的文章裡,我想談下sql server裡如何處理死鎖。當2個查詢彼此等待時會發生死鎖,沒有乙個查詢可以繼續它們的操作。首先我想給你大致講下sql server如何處理死鎖。最後我會展示下sql sever裡特定的死鎖型別,還有你如何避免和解決它們。

死鎖的好處是sql server自動檢測並解決它們。為了解決死鎖,sql server需要回滾2個事務中最便宜的那個。在sql server上下文中,最便宜的事務是寫入事務日誌更少位元組的那個。

sql server在後台程序中實現死鎖檢測稱為死鎖監控(deadlock monitor)。這個後台程序每5秒鐘執行一次,為死鎖檢查當前鎖定情況。在最壞的情況中,因此乙個死鎖不應該超過5秒。這個查詢會回滾並收到1205錯誤號。死鎖的好事是你可以完整從錯誤情況下還原,不需要使用者的任何干預。乙個聰明的開發者必須按下列步驟來從死鎖中恢復:

重新提交查詢後,這個查詢應該繼續執行,沒有任何問題,因為其它查詢已經完成它的事務。當然你應該保持再次發生死鎖的跟蹤,這樣的話,你不用反覆重試你的事務。

你可以用多種方法來故障排除死鎖。sql server profiler提供deadlock graph事件,一旦死鎖檢測到就會發生。如果你在sql server 2008或更高,你可以使用故障排除來故障排除死鎖場景。擴充套件事件提供你system_health事件會話,它跟蹤自sql server上次重啟後發生過的死鎖。還有啟用1222跟蹤標記,sql server會把死鎖資訊寫入錯誤日誌。

在sql server裡會發生各種型別的死鎖。在這一部分我想進一步談下最常見的幾個。

幾乎每個sql server我看到最典型的的死鎖是著名的書籤查詢死鎖,當你有同時對聚集和非聚集索引讀寫活動時發生。它基本上是因為不好的索引設計造成的。在我作日常sql server的故障排除重,我可以說所有的死鎖,至少有90%可以通過更好的索引設計來解決。書籤查詢死鎖可以通過提供覆蓋非聚集索引輕鬆解決。

另乙個常見的死鎖是所謂的迴圈死鎖(cycle deadlock),這裡你的每個查詢用不同的順序訪問表。為了避免這個特定的死鎖,你要確保每個查詢用同樣的順序訪問表。在sql server裡會發生的最有意思的死鎖是所謂的內部並行死鎖(intra-parallelism deadlock),這裡平行的運算子在各自的執行緒內部死鎖。下圖展示了乙個典型死鎖圖。

本身就是乙個藝術品,它因觸發sql server裡的bug而發生。遺憾的是,這個bug不會被微軟修正,因為它引入回歸的可能性。因此你要確保引起這個死鎖的查詢,要在sql server裡單執行緒執行。你可以通過多個選項來實現單執行緒執行:

另乙個死鎖的特效**是啟用樂觀併發,尤其是提交讀快照隔離(read committed snapshot isolation (rcsi)),他對你的程式是完全透明的。使用樂觀併發,共享鎖消失,這意味著在sql server裡你可以避免大量的典型鎖。

死鎖是sql server通過回滾最便宜的事務自動處理。然而你要盡可能小的確保死鎖,因為每個回滾的死鎖都會給你的終端使用者帶來不好的影響。死鎖可以通過好的索引策略來避免,另外使用樂觀併發也是應付它們的特效藥。

如何處理 TextBox 裡的非法字元

如題,小的擔心 sql 攻擊,我原本用替換字元寫入資料庫,讀取資料的時候再重新替換回來還原字元,但是這樣很不方便。不知道用驗證控制項的正規表示式可不可以達到這個過濾非法字元的目的,請問大家都是怎麼處理非法字元的?最好說得詳細點,我是個菜鳥,五體投地拜謝中 看你自己的需要,一般的處理是htmlenco...

如何處理DDoS

ddos 簡述 ddos是分布式拒絕服務 distributed denial of service 的英文縮寫,其 方式通常是利用很多受 者控制的 殭屍主機 向目標主機傳送大量看似合法的資料報,從而造成主機資源被耗盡或網路被堵塞,導致主機無法繼續正常提供服務。ddos通常可以分為兩類,即資源耗費式...

如何處理DDoS

ddos 簡述 ddos是分布式拒絕服務 distributed denial of service 的英文縮寫,其 方式通常是利用很多受 者控制的 殭屍主機 向目標主機傳送大量看似合法的資料報,從而造成主機資源被耗盡或網路被堵塞,導致主機無法繼續正常提供服務。ddos通常可以分為兩類,即資源耗費式...