SQL Server и очереди сообщений - PullRequest
2 голосов
/ 25 апреля 2009

Я пытаюсь создать надежную службу сообщений, или, по крайней мере, так я бы ее описал.

Вот моя проблема: у меня есть таблица, я вставляю данные в эту таблицу, у меня есть как минимум два приложения, которые выбирают данные из этой таблицы. Однако мне нужен надежный способ для двух разных приложений никогда не выбирать одинаковые строки в любой момент времени.

Как мне поступить при написании транзакции или оператора выбора, который гарантированно не выберет те же строки, которые недавно выбрали другие приложения.

Я не эксперт по SQL Server, но я бы ожидал чего-то подобного.

Выберите работу из таблицы, это даст приложению эксклюзивный доступ к некоторым строкам. Приложение затем обработает эти строки. Некоторые строки удаляются, некоторые строки возвращаются в базу данных.

Моя главная проблема заключается в том, что если приложению не удастся завершить обработку, SQL Server в конечном итоге прекратит работу и вернет извлеченные данные в пул данных приложения.

Ответы [ 4 ]

6 голосов
/ 25 апреля 2009

Добавьте флаг «Обрабатывается» к каждой записи, который устанавливается «атомарным» способом.

На SO было несколько вопросов и ответов, довольно похоже на это:

Как заблокировать определенные строки SQL при запуске процесса на них?

Очереди против таблиц в системах обмена сообщениями

Каков наилучший способ реализации таблицы очереди сообщений в mysql

Отправка сообщения в MSMQ из SQL Server

3 голосов
/ 05 октября 2011

это довольно старый вопрос, и, возможно, проблема автора давно устарела, но есть небольшая хитрость SQL, которая решает ее и может быть полезна для других: подсказка readpast. С readpast sql select пропустит заблокированные строки в запросе. Вам нужно взять первый незаблокированный ряд и немедленно заблокировать его, чтобы никто другой не получил его:

выберите топ 1 * из сообщений в порядке (readpast, updlock) по идентификатору

  • это выберет и заблокирует первое бесплатное сообщение в таблице, и никто другой не сможет его изменить. На самом деле я использую тот же подход в шине сообщений на основе SQL: http://http://code.google.com/p/nginn-messagebus/, и он работает очень плавно (иногда быстрее, чем MSMQ)
2 голосов
/ 25 апреля 2009

Взгляните на SQL Server Service Broker , он предназначен для такого рода проблем.

Если вам нужна очередь, используйте очередь.

0 голосов
/ 26 апреля 2009

Добавить «захваченный» столбец в таблицу сообщений. Каждый может попытаться получить строку одним оператором SQL:

UPDATE m
SET grabbed = 1
FROM messages m
WHERE id = @myid
and grabbed = 0

После этого, если @@ ROWCOUNT равно 1, строка принадлежит вам. В противном случае кто-то другой схватил ряд перед вами.

SQL Server Broker, MSMQ или MQSeries вносят значительную сложность и увеличивают затраты на обслуживание. Перед тем, как вы начнете его использовать, убедитесь, что сотрудник отдела операций, который получает ваши материалы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...