Как откатить транзакцию SSIS без MSDTC? - PullRequest
0 голосов
/ 01 ноября 2018

1-й.)

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

второй.)

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

третий.)

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

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

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Согласно моему Сценарию: Я использовал контейнер последовательности (который содержит различные 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 . Таким образом, он не будет следовать той же транзакции, и при возникновении любой ошибки он заносит ошибки в таблицу.

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

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

0 голосов
/ 01 ноября 2018

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

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

Работает довольно хорошо и довольно просто для реализации.

...