在SQL Server 中,如果出現了兩個事務相互等待對方釋放資源,就會出現死鎖。後啓動的事務或者死鎖優先級較低的事務將會被犧牲,提交被犧牲的事務的應用程序會出現異常。
那麼如何監視SQL Server 發生的死鎖事件呢?
SQL Server Profiler提供了一組事件,可以收集到發生的死鎖事件,並清楚的展現死鎖的原因和處理結果。實現的方法如下:
1、打開SQL Server Profiler,新建跟蹤,連接到發生死鎖的服務器;
2、選擇“TSQL_Locks”跟蹤模板
3、點擊“事件選擇”,可以看到其中幾個關鍵事件——SQL:StmtStarting(TSQL)、SP:StmtStarting(Stored Procedures)、Deadlock graph(Locks) 、Lock:Deadlock(Locks)、Lock:Deadlock Chain(Locks)
4、點擊“運行”,開始跟蹤
在跟蹤到死鎖之後,可以再Profiler中看到下面的死鎖相關事件發生:
選擇Profiler中的Deadlock graph 事件,可以看到下面的圖形:
該圖形表示左側的被標識爲X的事務被犧牲了,X箭頭表示事務對對象有排他鎖,U箭頭表示事務請改對象
將鼠標放在橢圓形的事務上,可以顯示導致死鎖發生的語句。
當然,在我們跟蹤到死鎖之後,需要解決死鎖的問題,還需要下面的方法:
●通過索引優化查詢
●事務儘可能的簡短
●儘量以相同的順序訪問對象
●如果允許的話,使用較低的隔離級別進行訪問