Использование 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

Так люди обычно подходят к этой проблеме? Мне кажется, что проблему лучше решить с помощью БД, если это возможно.

31
задан Synesso 4 September 2010 в 10:08
поделиться