分區表修改分區函數/配置時發生死鎖 (錯誤 1205),需自動重試步驟解決暫時性衝突。
在 sp_add_jobstep 中設定兩個關鍵參數:
注意: 總執行次數 = 1 (初始) + @retry_attempts。設 5 則實際最多執行 6 次。
USE [msdb]; GO
BEGIN TRANSACTION
DECLARE @ReturnCode INT, @jobId BINARY(16);
-- 建立作業
EXEC @ReturnCode = msdb.dbo.sp_add_job
@job_name = N'測試作業重試機制',
@enabled = 1, @owner_login_name = N'sa', @job_id = @jobId OUTPUT;
-- 步驟 1: 插入測試資料 (成功不重試)
EXEC msdb.dbo.sp_add_jobstep @job_id = @jobId, @step_name = N'插入資料',
@step_id = 1, @subsystem = N'TSQL', @command = N'EXEC dbo.sp_Insert',
@on_success_action = 3, @on_fail_action = 2, @retry_attempts = 0;
-- 步驟 2: 更新並模擬失敗 (失敗重試 5 次)
EXEC msdb.dbo.sp_add_jobstep @job_id = @jobId, @step_name = N'更新重試',
@step_id = 2, @subsystem = N'TSQL', @command = N'EXEC dbo.sp_UpdateCount',
@on_success_action = 1, @on_fail_action = 2,
@retry_attempts = 5, @retry_interval = 1; -- 關鍵設定
-- 設定起始步驟與排程
EXEC msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1;
EXEC msdb.dbo.sp_add_jobschedule @job_id = @jobId, @name = N'每10分鐘',
@freq_type = 4, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 10;
COMMIT TRANSACTION;
CREATE PROCEDURE dbo.sp_UpdateCount
AS
BEGIN
BEGIN TRANSACTION AltPS;
BEGIN TRY
UPDATE TestJobCounts SET Counts = Counts + 1;
-- 故意拋出嚴重度 13 錯誤模擬失敗
RAISERROR (N'模擬死鎖錯誤', 13, 55);
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION AltPS;
-- 即使失敗仍更新計數器 (驗證重試次數)
UPDATE TestJobCounts SET Counts = Counts + 1
WHERE Id = (SELECT MAX(Id) FROM TestJobCounts);
-- 重新拋出錯誤觸發作業重試
RAISERROR (N'模擬死鎖錯誤', 13, 55);
END CATCH
IF @@TRANCOUNT > 0 COMMIT TRANSACTION AltPS;
END
| 適用 | 不適用 |
|---|---|
| 死鎖受害者 (1205) | 邏輯錯誤 (語法、權限、資料型別) |
| 暫時性網路中斷 | 資料違反約束 (PK、FK、CHECK) |
| 資源爭用等待 | 永久性物件不存在 |