Как откатить транзакцию SSIS без MSDTC?

1-й.)

У меня есть контейнер Sequence. Он имеет 4 разные задачи выполнения SQL и 4 разных DFT, где данные вставляются в разные таблицы. Я хочу реализовать транзакцию с сервисом MSDTC или без него при сбое пакета, т. Е. Все данные должны иметь откат при сбое любого из DFT или выполнять задачу SQL. Как это реализовать? когда я пытаюсь реализовать службу MSDTC, я получаю сообщение об ошибке "Соединение OLEDB", и без MSDTC данные вставляются, только откатывается последняя задача выполнения Sql. Как реализовать это на ssis 2017?

Второй.)

когда я попытался без MSDTC, установив свойство ServerConnection RetainSameConnection как TRUE и взял еще две задачи выполнения sql для начала транзакции и фиксации. Я столкнулся с проблемой с обработчиком событий, т. Е. Я не смог записать ошибку в другую таблицу. Либо откат работает, либо обработчик событий при попытке манипулирования. Как только произошла ошибка, элемент управления переходит к обработчику событий, а затем откатывает все, включая задачу в обработчике событий.

Третий).

Контейнер последовательности используется для параллельного выполнения задач. Таким образом, особая задача среди 4-х получивших сбой, только то, что конкретная задача, получающая откат, оставляла задачу SQL вставлять данные в таблицы.

Заранее спасибо!!;-)

2 ответа

Одна из опций, которую я использовал (без MSDTC) - настроить соединение OLEDB как RetainSameConnection=True (через окно свойств)

Затем начните транзакцию перед вашим контейнером последовательностей и зафиксируйте впоследствии (все используют одно и то же соединение OLEDB.

Работает довольно хорошо и довольно легко реализовать.

Согласно моему Сценарию: я использовал контейнер последовательности (который содержит различные DFT и задачи), и взял еще 3 задачи "Выполнить sql":

1-я Начальная Транзакция T1(перед контейнером последовательности)

2-я фиксация транзакции T1(после контейнера последовательности)

3-я транзакция отката T1(после контейнера последовательности) с приоритетом в качестве сбоя, т. Е. Только в случае сбоя контейнера последовательности, выполняется задача "Выполнить Sql", содержащая операцию отката.

Примечание. Я попытался выполнить откат таким способом, но была вставлена ​​только текущая задача sql execute, т. Е. Ближайший к ней получал откат остальной части данных. Так в чем же решение? В той же самой задаче выполнения sql я обрезал таблицу, в которую вставлялись строки. Таким образом, при сбое контейнера последовательности задача execute sql усекает все данные в соответствующей таблице. (Транзакция отката T1 перейти к усеченной таблице Table_name1 перейти к усеченной таблице table_name2 перейти к усеченной таблице table_name3)

* ВАЖНО:*** Для того, чтобы вышеуказанная операция работала, убедитесь, что в свойствах диспетчера соединений **RetainSameConnection имеет значение True, по умолчанию это false.

Теперь, чтобы регистрировать ошибки в пользовательских таблицах, мы используем обработчик событий. Так что сценарий был, когда контейнер последовательности выходит из строя, все откатывается, включая таблицу, используемую в задаче execute sql в обработчике событий. Так в чем же решение?

Если вы не используете свойства транзакции служб SSIS, по умолчанию для каждой задачи установлены свойства, поддерживаемые. Задача Execute sql в обработчике событий также имеет те же свойства, что и Supported, поэтому она следует той же транзакции. Чтобы заставить обработчик событий работать должным образом, измените соединение задачи Execute Sql, т. Е. Выберите другое соединение и установите для TransactionProperty значение NotSupported. Таким образом, он не будет следовать той же транзакции, и при возникновении любой ошибки он заносит ошибки в таблицу.

Примечание: мы используем контейнер последовательности для параллельного выполнения задач. Что если? ошибка возникает в контейнере последовательности в любой задаче, и задача не позволяет контейнеру последовательности завершиться с ошибкой. В этом случае подключите все задачи последовательно. Да, это не имеет смысла для контейнера последовательности. Я нашел свое решение для работы сюда.

Надеюсь, это поможет всем! ;-)

Другие вопросы по тегам