Похоже, вы хотите, чтобы 2+ процессора обрабатывали записи из таблицы requests
.
Можете ли вы добавить столбец в таблицу requests
, чтобы указать, что он обработан?Другими словами, вы хотите следить за тем, чтобы он был «взят» и «закончен».Возможно, закончено в этом случае, может быть, вы удаляете записи из таблицы.Поэтому просто добавьте столбец, такой как ProcessingOn DATETIME
.
. С помощью этой конструкции вы можете иметь каждый процессор SELECT
в своем пакете, но, конечно же, убедитесь, что он не принимает тот, который уже находится вprocess '.
BEGIN TRAN
DECLARE @RecordsToProcess TABLE (ID int)
--grab our candidates
INSERT INTO @RecordsToProcess (ID)
SELECT ID FROM requests WHERE status = 1
AND ProcessingOn IS NULL ORDER BY queuetime
--mark our batch of records as 'in-process'.
UPDATE requests SET ProcessingOn = CURRENT_TIMESTAMP
WHERE ID IN (SELECT ID FROM @RecordsToProcess)
--get all those records to process.
SELECT * FROM requests
WHERE ID IN (SELECT ID FROM @RecordsToProcess)
COMMIT TRAN
Тогда вы, скорее всего, столкнетесь с ситуацией, когда пакет не прошел.В этом случае записи никогда не удаляются, но их ProcessingOn
не равно нулю.Возможно, установите допуск повторных попыток в SELECT
, при котором пороговое значение (возможно, 5 минут, возможно, 1 день, все, что вам нужно) используется для оценки необходимости повторной обработки этих записей.
--grab our candidates
INSERT INTO @RecordsToProcess (ID)
SELECT ID FROM requests WHERE status = 1
AND (ProcessingOn IS NULL OR ProcessingOn < DATEADD(day, -1, ProcessingOn)
ORDER BY queuetime