У меня есть таблица задач. Несколько пользователей одновременно пытаются получить задание. Это обрезается запрос сердце моей логики:Нужно ли мне ROWLOCK в дополнение к подсказкам (UPDLOCK, READPAST)?
; WITH TASKS_CTE AS (
SELECT TOP(1) T.TASK_ID AS TASK_ID,
T.ASSIGNED_USER_CODE AS ASSIGNED_USER_CODE,
T.STATUS AS STATUS
FROM TASK T WITH (ROWLOCK,READPAST)
JOIN TASK_SCORE TS WITH (NOLOCK) ON TS.TASK_ID = T.TASK_ID
WHERE
T.STATUS = 0
ORDER BY TS.TOTAL_SCORE DESC
)
UPDATE TASKS_CTE
SET STATUS = 1,
ASSIGNED_USER_CODE = @USER_CODE,
OUTPUT INSERTED.TASK_ID, INSERTED.ASSIGNED_USER_CODE, INSERTED.STATUS INTO @NEXT_TASK_TABLE;
я пропустил ту часть, где @@ ROWCOUNT проверяется, чтобы увидеть, если задача была успешно удалена из очереди.
Хорошо, оказывается, что (ROWLOCK, READPAST)
не мешает нескольким пользователям получать одну и ту же задачу. Я пришел по этим двум вопросам на SO, в SQL Server Process Queue Race Condition указано, что указывается (ROWLOCK, READPAST, UPDLOCK)
. С другой стороны, рекомендуется указать в Using a database table as a queue(UPDLOCK, READPAST)
.
Следовательно, мой вопрос: мне нужно указать ROWLOCK
в дополнение к (UPDLOCK, READPAST)
, чтобы реализовать очередь с несколькими клиентами? Что конкретно отличается от (UPDLOCK, READPAST)
и (UPDLOCK, READPAST, ROWLOCK)
?
Да, я знаю, что UPDLOCK отсутствует, этот код был моей начальной настройкой и оказался неработоспособным, как я предполагал. –