如何防止 SQL 代理作業並行執行
設計一組作業以使它們永遠不會同時執行的好方法是什麼?
我正在尋找一個通用概念,例如semaphore,它可以更輕鬆地確保某些作業永遠不會同時執行。
例如,我正在考慮一個“信號表”。當作業開始時,它會設置信號,並在結束時重置信號。此外,每個作業都需要等到信號設置好。(如何實現 CPU 友好等待?)但是,當作業崩潰時,必須有一個解決方案來自動重置信號,否則作業將永遠無法啟動。
我們有 4 個工作在進行各種更新、導入、計算。它們都是由調度程序執行的,此外,其中一些也可以由超級使用者手動啟動,以防需要特殊執行。但是,它們不應同時執行,因為這通常會導致鎖定甚至死鎖,並且數據庫無法正確響應使用者。
**編輯:**這是一個數據倉庫,它收集和整合來自多個外部數據源的數據。每個作業都負責另一個數據源,如下所示:
- 作業 #1 每 15 分鐘執行一次
- 工作 #2 每 3 小時
- 作業 #3 和作業 #4 每天執行一次,或者在由超級使用者啟動時額外執行。
除了評論之外,這裡還有一些你可以用來完成你想要做的事情的東西(因為我不喜歡為鎖定係統重新發明輪子)。
您可以使用系統
stored procedure
msdb.dbo.sp_help_job來確定您的另一個jobs
是否作為每個job
. 然後從那裡你可以選擇你希望它在另一個job
執行時接下來要採取的邏輯,例如結束job
(如果它在例行計劃中)或使用 實現模擬睡眠WAITFOR DELAY ('00:00:01') -- Sleeps for 1 second
,你可以將其放入WHILE
循環中以重新檢查job
狀態。您可以
sp_help_job
通過傳入job
名稱來呼叫:EXEC msdb.dbo.sp_help_job @Job_name = 'TheJobName'
您可以使用過程結果集中的列
current_execution_status
和列current_execution_step
來幫助您確定何時可以安全執行目前的job
.還有一些
job tables
可能對您查詢有幫助的系統,您可以在此StackOverflow 答案中閱讀。
如果正在使用 SQL Server 企業版,則可以根據分類器函式中 suser_name 中的帳戶將 SQL 代理作業分類到專門用於代理的工作負載組中。或者,每個相關作業的各個步驟都可以用作分類器函式中的 app_name 值。分配的工作負載組可以將 GROUP_MAX_REQUESTS 設置為 1,因此一次只能在工作負載組中執行 1 個請求。