2016-01-15 2 views
2

У меня есть таблица задач. Несколько пользователей одновременно пытаются получить задание. Это обрезается запрос сердце моей логики:Нужно ли мне 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)?

ответ

1

ROWLOCK предназначен для обеспечения того, чтобы эскалация блокировки ограничивалась только одной строкой. Это то, что вы хотите, чтобы гарантировать, что ваша очередь обработана в правильном порядке. В этом примере это будет хорошей практикой.

+0

Да, я знаю, что UPDLOCK отсутствует, этот код был моей начальной настройкой и оказался неработоспособным, как я предполагал. –

 Смежные вопросы

  • Нет связанных вопросов^_^