Учитывая таблицу, которая действует как очередь, как лучше всего настроить таблицу/запросы, чтобы несколько клиентов обрабатывали из очереди одновременно?
Например, в таблице ниже указывается команда, которую должен обрабатывать рабочий. Когда рабочий закончится, он установит обработанное значение в значение 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 и т.д.
Какой запрос/конфигурация позволит каждому рабочему клиенту получать разные строки и работать с ними одновременно?
EDIT:
В нескольких ответах предлагаются варианты использования самой таблицы для записи состояния в процессе. Я думал, что это невозможно в рамках одной транзакции. (то есть, какая точка обновления состояния, если другой рабочий не увидит его до тех пор, пока не будет зафиксирован txn?) Возможно, это предложение:
# start transaction
update to 'processing'
# end transaction
# start transaction
process the command
update to 'processed'
# end transaction
Так ли люди обычно подходят к этой проблеме? Мне кажется, что проблема будет лучше обрабатываться БД, если это возможно.