Служба SSIS Удалить, а затем Вставить: для сохраненного соединения указан несовместимый контекст транзакции - PullRequest
0 голосов
/ 16 января 2012

Я разрабатываю SSIS-пакет, который должен запросить (выполнить SP) исходную базу данных для поколений, а затем вставить эти поколения в базу данных назначения.

Для этого мне нужно составить парупроверок: генерация из исходной БД уже существует в целевой базе данных?Если нет, просто вставьте его.Если он существует, обновлялся ли он с момента последней вставки (иначе: LastModified отличается от того же поколения в DestinationDB)?Если нет, просто оставь это.Если это так, обновите Generation in Destination DB.

Проблема, с которой я сталкиваюсь, связана с соответствующими данными.Не только Поколение должно быть вставлено, но каждый связанный элемент должен быть вставлен также в таблицы Пункта назначения (например, Оборудование, Упаковки, ...).

Поскольку База данных является базой данных только для чтенияэто было легко достигнуто удалением поколения (которое каскадно относится к другим таблицам), а затем вставкой поколения снова.Все работало нормально.

Теперь следующим шагом является включение транзакций в этот рабочий процесс (когда я что-то удаляю, мне нужно вставить новые данные. Если это не удается, все нужно откатить).Я установил уровень изоляции пакета на Serializable, а TransactionOption на Required.Для DestinationConnection для RetainSameConnection установлено значение True.

Всякий раз, когда я пытаюсь отладить свой пакет с теми же данными, которые работали раньше, я получаю следующее сообщение об ошибке:

Указан несовместимый контекст транзакциидля сохраненного соединения.Это соединение установлено в другом контексте транзакции.Сохраненные соединения могут использоваться только в одном контексте транзакции.

По моему мнению, это потому, что я пытаюсь удалить все данные, а затем снова вставить их в ту же транзакцию.SSIS, вероятно, хочет использовать другие соединения (RetainSameConnection, установленный в False, решает проблему), но это не то, что я имел в виду, если только одно неуспешное соединение не вызывает откат другого (но я читал, что это не так)...).

Может кто-нибудь помочь направить меня в правильном направлении?Любая помощь приветствуется.

Спасибо!

1 Ответ

1 голос
/ 17 января 2012

Все сводится к тому, чтобы установить для свойства RetainSameConnection моего соединения значение false.Я подумал, что мне нужно, чтобы все это работало на одном и том же соединении, но, видимо, это не так.Откаты, похоже, работают даже без постоянно работающих компонентов на одном и том же соединении.

Grtz

...