Как я могу выполнить одну транзакцию для каждой строки ввода?

У меня есть поток данных с источником данных oledb. Затем у меня есть компонент сценария, который выполняет три вызова веб-службы, у него есть два выхода, которые (фактически) синхронны с входной строкой (одна выходная строка на входную строку), и один выход, который является асинхронным (выводит много строк для каждого входа). ряд). Каждый вывод идет в команду обновления sql. Также имеется вывод журнала ошибок (тоже асинхронный).

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

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

Как я могу структурировать свой поток данных для достижения этой цели?

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


person Erik Funkenbusch    schedule 27.03.2013    source источник


Ответы (2)


Я подозреваю, что единственный способ — поместить все, включая обновления, в один сценарий. SSIS не раскрывает достаточно своей стратегии буферизации потока данных, чтобы дать вам такой уровень контроля. На самом деле, чтобы ускорить процесс в конвейере, нужно приложить немало усилий, что прямо противоположно стратегии дросселирования, которую вы ищете. (См. Функции производительности потока данных на MSDN для обсуждения доступных функций настройки.)

В качестве альтернативы вы можете создать полностью настраиваемый компонент конечного конвейера. Учитывая, насколько болезненной является отладка компонентов сценария в SSIS 2008, такой подход может быть даже предпочтительным.

person Edmund Schweppe    schedule 27.03.2013
comment
Спасибо за информацию, однако я решил изменить свою стратегию и переместил все в один скрипт с несколькими выводами. Я полностью изменил свой вопрос, и я думаю, что вы отвечали на мой предыдущий вопрос. - person Erik Funkenbusch; 28.03.2013

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

Затем я использую контейнер For Each для чтения набора записей и помещаю имя пользователя в переменную. Внутри For Each у меня есть поток данных с источником OLEDB, который использует переменную в качестве параметра для повторного выбора пользователей (это приводит к поиску для каждой итерации набора данных, но это нормально).

Это входит в мой сценарий.

Кроме того, я размещаю задачи «Выполнение SQL» до и после пакета в цикле for each, поэтому мне не нужно использовать транзакции DTC, и я могу обрабатывать каждую входную строку как отдельную транзакцию.

person Erik Funkenbusch    schedule 28.03.2013