Sql-Server

如何防止 SQL 代理作業並行執行

  • December 21, 2020

設計一組作業以使它們永遠不會同時執行的好方法是什麼?

我正在尋找一個通用概念,例如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 個請求。

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-workload-group-transact-sql?view=sql-server-ver15

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