#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?