Sql-Server

需要故意創建阻塞程序進行測試

  • July 22, 2016

我和我的團隊有一個問題,我們需要能夠辨識阻塞其他程序並殺死它們的程序。有大量腳本可免費用於執行這些操作。我們嘗試了各種方法並仔細檢查了程式碼。(如果您是發布過這些查詢之一的人,謝謝!)

在進一步討論之前,讓我告訴您,這是針對我們無法修改的供應商應用程序。供應商也不願意花時間找出程序被阻塞的原因。此時我們唯一的選擇是終止長時間執行的程序(如供應商支持所建議的那樣)。在終止這些程序之前,我們會檢查正在執行的查詢,但 99.9% 的情況下,它顯示為FETCH API_CURSOR00000000000A7E1F,這沒有告訴我們任何資訊。

到目前為止,這一直是一個手動過程。現在,我們希望自動殺死這些長時間執行的阻塞程序,而不是手動殺死它們。

我們想在將它投入生產之前測試這個腳本。我們需要一些幫助來創建一個有意創建阻塞程序的腳本。我們已經嘗試使用此應用程序的 TEST 環境,但不幸的是,我們沒有運氣複製阻塞程序。

提前感謝你的幫助!

BEGIN TRANSACTION
 SELECT * FROM YourTable WITH (TABLOCKX, HOLDLOCK)
   WAITFOR DELAY '00:05:00' -- 5 minutes
ROLLBACK TRANSACTION

然後在另一個查詢視窗中:

SELECT * FROM YourTable

這很容易做到。在 Management Studio 中打開兩個查詢視窗。

在第一個中執行類似的東西(選擇一個沒有人使用的測試表,因為這會阻止他們,並確保它至少有一行):

BEGIN TRANSACTION
SELECT * FROM sometesttable WITH (TABLOCK, XLOCK, HOLDLOCK)

然後在第二個查詢視窗中:

SELECT * FROM sometesttable

您的第二個查詢將被阻止,直到第一個查詢被送出或回滾。

引用自:https://dba.stackexchange.com/questions/144591