Может ли пакет SSIS, вызываемый с использованием xp_cmdshell, участвовать в транзакции SQL Server?

#sql-server #transactions #ssis #xp-cmdshell

#sql-server #транзакции #ssis #xp-cmdshell

Вопрос:

У меня есть очень простой пакет SSIS с одной задачей потока данных (из источника OLE DB в плоский файл).

Поток управления

Поток данных

Для свойства TransactionOption установлено значение Required, и я попробовал параметр IsolationLevel, для которого установлены значения ReadCommitted, ReadUncommitted и Serializable.

Пакет экспортирует все строки из таблицы [TestTable] в плоский файл.

У меня есть следующий SQL-скрипт (который я запускаю в Management Studio на данный момент):

 BEGIN TRANSACTION

DELETE FROM [dbo].[TestTable]

DECLARE @SsisString VARCHAR(8000)
DECLARE @PackageName VARCHAR(200)
DECLARE @ServerName VARCHAR(100)
DECLARE @ReturnCode INT

SET @PackageName = 'TransactionalTestPackage'
SET @ServerName = 'SERVERNAME'
SET @SsisString = 'dtexec /sq '   @PackageName   ' /ser '   @ServerName   ' '

EXEC @ReturnCode = xp_cmdshell @SsisString

SELECT @ReturnCode

--COMMIT TRANSACTION
ROLLBACK TRANSACTION
  

Обратите внимание, что я удаляю все строки из таблицы перед запуском пакета, поэтому теоретически пакет должен экспортировать нулевые строки в файл, но на самом деле происходит то, что пакет зависает (я думаю, из-за незафиксированного удаления в тестовой таблице). Вопрос в том, действительно ли пакет SSIS, вызываемый таким образом, участвует в транзакции, запущенной в верхней части блока SQL, и если нет, может ли это?

Ответ №1:

Действия в xp_cmdshell будут находиться за пределами транзакции, не имеет значения, является ли это SSIS или другим запросом. Вы могли бы так же легко заменить @ssisstring на ‘sqlcmd -S myserver -d mydatabase -Q «ВЫБЕРИТЕ TOP 1 ИЗ dbo.Тестовая таблица»

Если вам нужны транзакции, сделайте это в SSIS. Поместите ваш оператор DELETE в качестве задачи выполнения SQL. Подключите это к вашей задаче потока данных. На уровне пакета (щелкните правой кнопкой мыши на фоне потока управления и выберите свойства) измените уровень транзакции пакета с поддерживаемого на Требуемый. Это запустит транзакцию. Все, что содержится в нем, будет включено в родительскую транзакцию, если вы явно не откажетесь от транзакции, изменив уровень транзакции по умолчанию с поддерживаемого на не поддерживаемый.

Комментарии:

1. ХОРОШО, все в порядке. Причина, по которой удаление находится за пределами пакета, заключается в том, что это часть тестового запуска, и УДАЛЕНИЕ удаляет все существующие данные. На самом деле мы бы этого не сделали, и пакет SSIS завершится ошибкой, если будут обнаружены какие-либо существующие данные. Каковы мои варианты, если я хочу убедиться, что пакет SSIS участвует в транзакции, вызывая его из. СЕТЕВОЕ приложение в TransactionScope?, запускающее его из задания агента SQL?