Согласно моему Сценарию:
Я использовал контейнер последовательности (который содержит различные DFT и задачи) и взял еще 3 задачи «Выполнить sql»:
транзакция 1-го начала T1 (перед контейнером последовательности)
2-я фиксация транзакции T1 (после контейнера последовательности)
3-я транзакция отката T1 (после контейнера последовательности) с приоритетом как сбой, т. Е. Только при сбое контейнера последовательности выполняется задача «Выполнить Sql», содержащая операцию отката.
Примечание : я попытался откатить таким способом, но была вставлена только текущая задача выполнения sql, т. Е. Ближайшая к ней получала откат остальной части данных. Так в чем же решение? В той же самой задаче выполнения sql я обрезал таблицу, в которую вставлялись строки. Таким образом, при сбое контейнера последовательностей задача execute sql усекает все данные в соответствующей таблице. (Транзакция отката T1 перейти к усеченной таблице Table_name1 перейти к усеченной таблице table_name2 перейти к усеченной таблице table_name3)
* ВАЖНО: *** Чтобы вышеуказанная операция работала, убедитесь, что в свойствах диспетчера подключений ** RetainSameConnection по умолчанию установлено значение True, значение false.
Теперь, чтобы регистрировать ошибки в пользовательских таблицах, мы используем обработчик событий. Так что сценарий состоял в том, что, когда контейнер последовательности выходит из строя, все откатывается, включая таблицу, используемую в задаче execute sql в обработчике событий. Так в чем же решение?
Если вы не используете свойства транзакции служб SSIS, по умолчанию для каждой задачи установлены поддерживаемые свойства. Задача Execute sql в обработчике событий также имеет те же свойства, что и Поддерживается , поэтому она следует той же транзакции. Чтобы заставить обработчик событий работать должным образом, измените соединение задачи Execute Sql, т. Е. Выберите другое соединение и установите TransactionProperty в NotSupported . Таким образом, он не будет следовать той же транзакции, и при возникновении любой ошибки он заносит ошибки в таблицу.
Примечание: мы используем контейнер последовательности для параллельного выполнения задач. Что если? ошибка возникает в контейнере последовательности в любой из задач, и задача не позволяет контейнеру последовательности завершиться с ошибкой. В этом случае подключите все задачи последовательно. Да, это не имеет смысла для контейнера последовательности. Я нашел свое решение для работы таким образом.
Надеюсь, это поможет всем! ; -)