2009-04-28 114 views
65

我們遇到了一個代碼塊在面對慢速數據庫時響應不佳的問題(它在查詢超時時間上喋喋不休)。我們已經創建了一個補丁,並且正在通過迴歸運行它。在SQL Server中強制查詢超時

我們不能超時。我已經從SQL Mgmt Studio中打開了一個事務並更新了每一行來鎖定它們,但是這不會導致INSERT超時(這是我需要的)。

我可以通過T-SQL輕鬆獲得表級鎖嗎?或者我必須在主人身邊擺弄?或者我可以輕鬆地強制超時而不鎖定?任何輸入讚賞。

回答

102

來看,這種再試試你的INSERT ...

select * from yourTable with (holdlock,tablockx) 

在這裏,你可以將其鎖定爲5分鐘:

BEGIN TRANSACTION 

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK) 

WHERE 0 = 1 

WAITFOR DELAY '00:05' 

ROLLBACK TRANSACTION 
19

你可以告訴你的SQL代碼等待一分鐘在返回之前:

WaitFor Delay '00:01:00' 
+0

投票回答簡單。我已經測試過它,它的工作原理 – Mikel 2017-08-08 12:51:08

8

在前端側:如果連接配置,連接字符串超時減少到1秒 - 這將使它更容易。用大量數據填充表格,並讓其他3個進程在一個循環中旋轉,用循環中的事務更新該表格的塊。不要改變應用程序調用的實際過程(注入waitfor)。這使集成測試無效。

但實際上,這是一個有利於單元測試和依賴注入的案例研究。有些事情很難整合測試。單元測試+ dependency injection

  • 真實:代碼craps - >數據庫超時(難以重現)。
  • 重構:代碼是胡扯 - >庫(做資料存取) - >數據庫
  • 單元測試:代碼擲骰子>Mock repository扔 - >空
  • 現在你有一個代碼失敗的測試是胡扯和可以修復它。

這是「依賴性」注射。開發人員可以將依賴關係注入數據庫,替換模擬依賴關係行爲的東西。所有數據庫測試都很好。無論如何,隨着單元測試的到位,您知道修補程序確實應該做些什麼,但您仍然需要進行集成測試。在這種情況下,它可能更好地關注迴歸 - 這意味着測試它不會破壞其他任何內容,並且該功能仍然有效。

你已經創建了你的補丁,所以我想我的答案爲時已晚。