你有時候就你喜歡的書。 --馮唐
1. SqlServer發生dead-lock 事件,主要是因為存在兩個線程分別佔有某個資源的獨佔鎖,然後這兩個線程再去擷取對方擁有的資源的獨佔鎖。這樣就導致了dead-lock發生。
2. SqlServer 在遇到dead-lock後,會從兩個線程中選取一個線程作為winner,winner的事務接著執行,另個線程則會成為loser,loser的事務則會rollback,對於loser,SqlServer則會給返回一個error message給應用程式,如果應用程式健壯,會處理這個error,得到了這個dead-lock error,則會再次提交剛才失敗的交易。如果沒有處理,則會出現錯誤。
3. 在SqlServer中可以利用Sql Server Profiler 來跟蹤死結的發生。具體過程如下:
3.1 選擇相關事務,如:
若sql server 遇到死結,列表中的事件就會被觸發,從而可以跟蹤判斷是什麼原因導致了dead-lock發生。
3.2 運行跟蹤
需要將教務系統中遇到的dead-lock情況再次複現。讓sql Server profiler來捕獲。
3.3 分析跟蹤
再擷取到dead-lock的現象後,可以在profiler看到類似於下面這樣的圖:
其中圖中可以看出,第9行出發了dead-lock events,可以看到具體的描述資訊。在第13,14行可以看出,其中一個事務被強制rollback,另一個事務繼續執行。其中第11行可以點擊查看更詳細的資訊。看出具體是什麼sql語句導致dead-lock,兩個事務是在擷取什麼資源時發生dead-lock。
3.4 擷取到這些資訊之後,再結合具體的代碼邏輯,做進一步的深入分析。
參考文檔:
http://www.simple-talk.com/sql/learn-sql-server/how-to-track-down-deadlocks-using-sql-server-2005-profiler/