Есть ли способ отката транзакций в SSIS для SQL Server 2012? - PullRequest
0 голосов
/ 22 сентября 2019

Невозможно успешно выполнить пакет служб SSIS с функциональностью BEGIN TRAN.

Я в недоумении с унаследованным пакетом служб SSIS.Он содержит:

  • 1 Задача сценария
  • 3 Выполнение задач SQL
  • 5 Задачи потока данных (каждая содержит ряд слияний, поисков, вставок данных и других преобразований)
  • 1 задача файловой системы пакета.

Все они заключены в контейнер цикла Foreach.Мне было поручено изменить пакет так, чтобы в случае сбоя любого из шагов в потоке управления / данных все было откатано.Теперь я попробовал два разных подхода для достижения этой цели:

I.Использование распределенных транзакций.

Я гарантировал, что:

  • MSDTC запущен на целевом сервере и выполняется клиент (скриншот прилагается)
  • msdtc.exe в качестве исключенияк серверу и клиентскому брандмауэру
  • Для сервера и клиента установлены входящие и исходящие правила, разрешающие DTC-соединения.
  • Контейнер ForeachLoop TrasanctionLevel: Обязательный
  • Все остальные задачи TransactionLevel: поддерживается
  • Для моего соединения OLEDB RetainSameConnection установлено значение ИСТИНА, и я использую проверку подлинности SQL Server с проверенным паролем сохранения

Когда я выполняю пакет, он завершается ошибкойпосле выполнения скрипта (первый шаг).Потратив целую неделю, пытаясь найти обходной путь, я решил попробовать SQL Tasks, чтобы попытаться выполнить свою задачу, используя 3 задачи «Выполнение SQL»:

  • BEGIN TRAN до контейнера ForeachLoop
  • COMMIT TRAN после контейнера ForeachLoop с ограничением успеха
  • ROLLBACK TRAN после контейнера ForeachLoop с ограничением Failure

В этом случае контейнер ForeachLoop и все другие задачиИмейте TransactionLevel свойство установлено в Supported.Теперь проблема в том, что пакет выполняет до четвертой задачи потока данных и зависает там вечно.После входа в SQL Server и проверки запущенных сеансов я заметил sys.sp_describe_first_result_set;1 как сеанс хедбокера.

Проведя некоторые исследования, я обнаружил, что это может быть связано с несколькими операторами TRUNCATE в некоторых моих потоках данных.задачи, которые могут вызвать блокировку схемы.Я пошел дальше и изменил свойство ValidateExternalMetaData на False для всех задач в моем потоке данных и вместо этого изменил свои усеченные операторы на DELETE.Перезапустил пакет и до сих пор висит на том же месте с тем же хедбокером.В качестве альтернативы я попытался создать второе соединение OLEDB с той же базой данных, назначил это новое соединение OLEDB моим задачам BEGIN, ROLLBACK и COMMIT SQL с RetainSameConnectionProperty, установленным в значение ИСТИНА, и изменил RetainSameConnectionProperty наFALSE (и попытался сделать это с TRUE) в исходном соединении OLEDB (используемом задачами потока данных).Это работало в том смысле, что пакет, казалось, выполнялся (он запускался, а Commit Tran выполнялся нормально), а затем я снова запустил его с принудительной ошибкой, которая привела к сбою, и, однако, задача Rollback TRAN была выполнена успешно, когда я запросилзатронутые таблицы, транзакция не откатилась, все новые записи были вставлены, а старые были обновлены (begin tran был явно запущен в другом соединении и, следовательно, не влиял на рабочий процесс пакета).Я не уверен, что еще можно попробовать на этом этапе.Любая помощь будет принята с благодарностью, я собираюсь сойти с ума с этим!

PS Кроме того, все объекты имеют «DelayValidation», установленный в true на все, и версия SQL Server 2012.

...