Учитывая таблицу, которая действует как очередь, как мне лучше всего настроить таблицу / запросы, чтобы несколько клиентов обрабатывали из очереди одновременно?
Например, , в таблице ниже указаны команды, которые должен обработать рабочий. Когда рабочий процесс завершится, он установит обработанное значение в 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
Так люди обычно подходят к этой проблеме? Мне кажется, что проблему лучше решить с помощью БД, если это возможно.