Использование SQL Server в качестве очереди БД с несколькими клиентами
Учитывая таблицу, которая действует как очередь, как я могу лучше всего настроить таблицу / запросы так, чтобы несколько клиентов обрабатывали из очереди одновременно?
Например, в таблице ниже указана команда, которую должен обработать работник. Когда рабочий будет сделан, он установит обработанное значение в true.
| ID | COMMAND | PROCESSED |
| 1 | ... | true |
| 2 | ... | false |
| 3 | ... | false |
Клиенты могут получить одну команду для работы следующим образом:
select top 1 COMMAND
from EXAMPLE_TABLE
with (UPDLOCK, ROWLOCK)
where PROCESSED=false;
Однако, если есть несколько рабочих, каждый пытается получить строку с ID = 2. Только первый получит пессимистическую блокировку, остальные будут ждать. Тогда один из них получит ряд 3 и т. Д.
Какой запрос / конфигурация позволят каждому рабочему клиенту получать разные строки и работать с ними одновременно?
РЕДАКТИРОВАТЬ:
В нескольких ответах предлагаются варианты использования самой таблицы для записи состояния процесса. Я думал, что это не будет возможно в рамках одной транзакции. (то есть, какой смысл обновлять состояние, если никакой другой работник не увидит его, пока txn не будет зафиксирован?) Возможно, предложение таково:
# start transaction
update to 'processing'
# end transaction
# start transaction
process the command
update to 'processed'
# end transaction
Так люди обычно подходят к этой проблеме? Мне кажется, что проблема была бы лучше решена БД, если это возможно.