Какой подход к блокировке SQL Server 2005/2008 следует использовать для обработки отдельных строк таблицы в нескольких экземплярах серверных приложений?

Мне нужно разработать серверное приложение (на C #), которое будет считывать строки из простой таблицы (в SQL Server 2005 или 2008 ), выполнять некоторую работу, например, вызывать веб-службу, а затем обновлять строки с результирующим статусом (успех, ошибка ).

Выглядит довольно просто, но все становится сложнее, когда я добавляю следующие реквизиты приложения:

  • Несколько экземпляров приложения должны работать одновременно в целях балансировки нагрузки и отказоустойчивости. Как правило, приложение развертывается на двух или более серверах и одновременно обращается к одной и той же таблице базы данных. Каждая строка таблицы должна обрабатываться только один раз , поэтому между несколькими экземплярами приложения должен использоваться общий механизм синхронизации/блокировки.

  • Когда экземпляр приложения обрабатывает набор строк, другие экземпляры приложения не должны ждать его завершения, чтобы прочитать другой набор строк, ожидающих обработки.

  • В случае сбоя экземпляра приложения не требуется никакого ручного вмешательства в обрабатываемые строки таблицы (, например удаление временного статуса, используемого для блокировки приложения для строк, которые обрабатывал экземпляр, в котором произошел сбой ).

  • Строки должны обрабатываться в очереди -по моде, т. е. самые старые строки должны обрабатываться первыми.

Хотя эти требования не выглядят слишком сложными, у меня возникли некоторые проблемы с поиском решения.

Я видел подсказки блокировки, такие как XLOCK, UPDLOCK, ROWLOCK, READPASTи т. д.,но я не вижу комбинации блокирующих подсказок, которая позволила бы мне реализовать эти реквизиты.

Спасибо за любую помощь.

С уважением,

Нуно Геррейро

5
задан marc_s 4 July 2012 в 19:09
поделиться