CREATE OR ALTER PROCEDURE dbo.CharacterEnrichmentRun_ClaimNext @LeaseMinutes int = 90 AS BEGIN SET NOCOUNT ON; SET XACT_ABORT ON; DECLARE @RunID int; BEGIN TRANSACTION; SELECT TOP (1) @RunID = CharacterEnrichmentRunID FROM dbo.CharacterEnrichmentRuns WITH (UPDLOCK, HOLDLOCK) WHERE IsCurrent = 1 AND ( Status = N'Queued' OR (Status = N'Running' AND StartedUtc < DATEADD(minute, -ABS(@LeaseMinutes), SYSUTCDATETIME())) ) ORDER BY QueuedUtc, CharacterEnrichmentRunID; IF @RunID IS NULL BEGIN COMMIT TRANSACTION; SELECT TOP (0) * FROM dbo.CharacterEnrichmentRuns; RETURN; END; UPDATE dbo.CharacterEnrichmentRuns SET Status = N'Running', StartedUtc = SYSUTCDATETIME(), AttemptCount = AttemptCount + 1, CurrentStage = N'Preparing character analysis', CurrentMessage = N'Preparing character analysis...', UpdatedUtc = SYSUTCDATETIME() WHERE CharacterEnrichmentRunID = @RunID AND IsCurrent = 1 AND ( Status = N'Queued' OR (Status = N'Running' AND StartedUtc < DATEADD(minute, -ABS(@LeaseMinutes), SYSUTCDATETIME())) ); IF @@ROWCOUNT = 0 BEGIN COMMIT TRANSACTION; SELECT TOP (0) * FROM dbo.CharacterEnrichmentRuns; RETURN; END; SELECT * FROM dbo.CharacterEnrichmentRuns WHERE CharacterEnrichmentRunID = @RunID; COMMIT TRANSACTION; END; GO