Существует небольшая система, в которой таблица базы данных является очередью на MSSQL 2005. Несколько приложений пишут в эту таблицу, а одно приложение читает и обрабатывает в режиме FIFO.
Я должен сделать его немного более продвинутым, чтобы создать распределенную систему, в которой могут работать несколько приложений обработки. В результате должно получиться, что обрабатывающее приложение 2-10 должно работать, и оно не должно мешать друг другу во время работы.
Моя идея - расширить таблицу очередей строкой, показывающей, что над ней уже работает процесс. Приложение обработки сначала обновит таблицу своим idetifyer, а затем запросит обновленные записи.
Так что-то вроде этого:
start transaction
update top(10) queue set processing = 'myid' where processing is null
select * from processing where processing = 'myid'
end transaction
После обработки он устанавливает в столбце обработки таблицы что-то еще, например, «выполнено» или что-то еще.
У меня есть три вопроса об этом подходе.
Во-первых: это может работать в этой форме?
Второе: если это работает, эффективно ли это? У вас есть другие идеи по созданию такого дистрибутива?
В-третьих: в MSSQL блокировка основана на строках, но после блокировки количества строк блокировка распространяется на всю таблицу. Таким образом, второе приложение не может получить к нему доступ, пока первое приложение не освободит транзакцию. Насколько большим может быть выделение (top x), чтобы не блокировать всю таблицу, а только создавать блокировки строк?