Невозможно успешно выполнить пакет служб 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.