Sql-Server

在作業執行過程中達到穩定點是什麼意思?

  • April 12, 2022

當插入 100 行時,嘗試sp_stop_job停止在表上插入數據的簡單作業,我很困惑地看到表每次都超過 100 行。在文件的備註部分下,sp_stop_job它說:

sp_stop_job向數據庫發送停止信號。有些程序可以立即停止,有些程序必須到達穩定點(或程式碼路徑的入口點)才能停止。

我不明白*達到穩定點(或程式碼路徑的入口點)*意味著什麼,我相信這項工作會一直在表上插入數據,因為它仍在達到那個穩定點。


編碼:

CREATE TABLE [dbo].[myStopJobTable](
   [id] [int] NULL,
   [nome] [varchar](50) NULL
);

我創建了一個包含執行以下程式碼的步驟的作業:

WHILE (1=1)
BEGIN  

   INSERT INTO MyLab.dbo.myStopJobTable
   VALUES (1, 'Some Name');

   IF ((SELECT COUNT(*) FROM myStopJobTable) = 100)
   BEGIN
       EXEC msdb.dbo.sp_stop_job N'JobToBeStopped';
   END

END;

從該範常式式碼中,我希望該作業在插入第 101 行之前停止,但事實並非如此。BREAK通過在塊內添加 a ,IF該過程在插入第 101 行之前停止,但在這種情況下它sp_stop_job不起作用。


我不想修復這項工作,我尋求的是理解那個穩定點(或程式碼路徑的入口點)。這是什麼意思?

這項工作不是等待“達到穩定點”。關鍵點是:

sp_stop_job 向數據庫發送停止信號。

sp_stop_job發送停止請求 SQL Server 代理但不等待它完成。當 SQL Server 代理非同步處理停止請求時,T-SQL 腳本會繼續執行。在執行之後插入的附加行sp_stop_job反映了從收到停止請求到 SQL Server 代理取消它之間的時間。這通常需要幾毫秒或更長時間,具體取決於整體活動。

在 T-SQL 作業步驟的上下文中有關“達到穩定點”的註釋與任何查詢取消請求相同。它包括數據庫引擎需要釋放資源和回滾事務的時間。對於您的範例中的單例插入來說,這段時間是微不足道的,但如果取消的腳本完成了更多的工作,比如在單個事務中插入數百萬行,那將會更加明顯。

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