Асинхронное выполнение SQL-процедуры установлено и ожидает завершения
Скажем, у меня есть большой набор вызовов для запуска процедуры, которые имеют различные параметры, но являются независимыми, поэтому я хочу сделать параллельные / асинхронные вызовы. Я использую сервисный брокер, чтобы запустить их все, но проблема в том, что я хочу знать аккуратные способы узнать, как ждать их завершения (или ошибки).
Есть ли способ сделать это? Я полагаю, что я мог бы просто зацикливаться на ожиданиях в таблице результатов, проверяя ее на предмет завершения, но это не очень "событие вызвано". Надеясь на лучший способ сделать это.
Я использовал сервисный брокер с кодом очереди и обработкой на основе этого другого ответа: пример очереди Remus сервисного брокера
1 ответ
Добрый день, Шив,
Есть несколько способов (как всегда), которые вы можете использовать для реализации этого требования. Один из них использует эту логику:
(1) Создайте две очереди: одна будет триггером для запуска основного SP, который вы хотите выполнить в асинхронном режиме, а другая будет триггером для выполнения того, что вы хотите выполнить после завершения всех выполнений.
(2) Когда вы создаете сообщение в первой очереди, вы должны также создать сообщение во второй очереди, которое будет сообщать нам только то, какое выполнение еще не закончилось (первая очередь дает информацию о том, какое выполнение началось, поскольку после того, как мы НАЧИНАЕМ выполнение, мы используйте сообщение и удалите его из очереди).
(3) Внутри SP, который вы выполняете, используя основную первую очередь (эта часть выполняется синхронно):
(3.1) выполнить нужные вам запросы
(3.2) удалить эквивалентное сообщение из второй очереди (это означает, что это сообщение будет удалено только после завершения запросов)
(3.3) проверьте, есть ли сообщения во второй очереди. Если сообщений нет, все задачи завершены, и вы можете выполнить последний шаг
** Теоретически вместо использования второй очереди вы можете хранить данные в таблице, но использование второй очереди, вероятно, должно дать лучшую производительность, чем обновление таблицы при каждом завершении выполнения. Во всяком случае, вы тестируете возможность использования таблицы.