Sql-Server
在 MSSQL 上造成人為的無限死鎖?
有沒有辦法在 MSSQL 上造成人為的無限死鎖?我需要造成死鎖,這樣我就可以測試一些儲存過程來自動消除死鎖。有沒有辦法做到這一點?
Brendan McCaffrey 是對的,在正常情況下,SQL Server 會自動辨識和解決死鎖。
有時存在導致未檢測到的死鎖的錯誤。處理這些問題的正常建議是將可用更新應用到 SQL Server,如果問題仍然存在,請向 Microsoft 開票。
如果您的環境中確實存在未檢測到(無限)死鎖的問題,並且需要一種方法來創建這種情況,以便您可以測試您的程式方法來殺死它們,Joe Obbish 有一個很好的方法來創建一個:
該方法的總結是執行一個普通查詢,該查詢將獲取並持有一些鎖,然後
OPENROWSET
在同一會話中執行一個查詢,該查詢請求對同一對象進行鎖。這會導致無法自行解決的奇怪循環依賴,並且 SQL Server 不會將其檢測為死鎖。
死鎖本質上是無限的。當兩個事務相互阻塞時會發生死鎖。在另一個事務釋放它的鎖之前,兩個事務都不能前進。但是,由於每個事務都在等待另一個事務,因此兩個事務都不會釋放其鎖定。
但是,SQL Server 每 5 秒檢查一次死鎖,並選擇一個受害者。因此,我不確定您是否真的需要建構一個流程來執行 SQL Server 已經執行的操作。
處理死鎖的更好方法是監視它們。如果您注意到它們的數量很大,請聯繫您的應用程序團隊並詢問他們在數據庫中執行事務時是否優雅地處理了死鎖情況。他們可能是,而且他們並不真正關心是否發生了僵局。
簡而言之,如果發生死鎖,則將中止事務以允許剩餘事務繼續。如果應用程序沒有處理它們,那麼可能有人在某處抱怨它們。