※使用方法前先在測試環境使用,以免發生不必要的問題
一、SQL Server 查看死鎖進程
下面的SQL語句可用於查看產生死鎖的進程和“殺死”死鎖進程:
①查看產生死鎖的表:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'
其中spid表示鎖表的進程,tableName表示被鎖的表名。
②“殺死”死鎖進程:
kill spid
其中spid表示鎖表的進程,需要根據①中查詢的結果賦值。
-----------------------------------------------------------------------------------------
舉例說明:
某SQL Server數據庫某張表發生死鎖,使用Navicat打開表時會一直顯示“正在加載”,此時執行①語句查詢結果如下圖:
根據查詢結果我們可以得知是Person表發生死鎖,此時執行如下SQL語句:
kill 75
來“殺死”導致死鎖的75進程,然后表就可以正常查詢了。
二、如何減少死鎖
雖然不能完全避免死鎖,但可以使死鎖的數量減至最少。將死鎖減至最少可以增加事務的吞吐量並減少系統開銷,因為只有很少的事務回滾,而回滾會取消事務執行的所有工作。由於死鎖時回滾而由應用程序重新提交。
下列方法有助於最大限度地降低死鎖:
①按同一順序訪問對象
如果所有並發事務按同一順序訪問對象,則發生死鎖的可能性會降低。例如,如果兩個並發事務獲得 Person表上的鎖,然后獲得 Part 表上的鎖,則在其中一個事務完成之前,另一個事務被阻塞在 Person 表上。第一個事務提交或回滾后,第二個事務繼續進行。不發生死鎖。將存儲過程用於所有的數據修改可以標准化訪問對象的順序。
②避免事務中的用戶交互
避免編寫包含用戶交互的事務,因為運行沒有用戶交互的批處理的速度要遠遠快於用戶手動響應查詢的速度,例如答復應用程序請求參數的提示。
③保持事務簡短並在一個批處理中
在同一數據庫中並發執行多個需要長時間運行的事務時通常發生死鎖。事務運行時間越長,其持有排它鎖或更新鎖的時間也就越長,從而堵塞了其它活動並可能導致死鎖。保持事務在一個批處理中,可以最小化事務的網絡通信往返量,減少完成事務可能的延遲並釋放鎖。
④使用低隔離級別
確定事務是否能在更低的隔離級別上運行。執行提交讀允許事務讀取另一個事務已讀取(未修改)的數據,而不必等待第一個事務完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串行讀)可以縮短持有共享鎖的時間,從而降低了鎖定爭奪。
⑤使用綁定連接
使用綁定連接使同一應用程序所打開的兩個或多個連接可以相互合作。次級連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有,反之亦然,因此不會相互阻塞。
————————————————
版權聲明:本文為CSDN博主「HoHoGoal」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/houkyle/article/details/92792109