我有一个非常简单的SSIS包,其后只是一个数据导入和一个执行SQL任务。如果包的任何部分失败,我想回滚一切,所以我将这些任务放在一个Sequence Container中,并将Sequence Container TransactionOption属性设置为'Required',并将FailPackageonFailure属性设置为'True'。当我瞄准本地数据库时,这很好用。但是,当我尝试将OLE DB连接更改为远程服务器时,上述属性设置会导致程序包挂起并最终失败并显示“无法获取连接”消息。我在网上看到过类似的问题描述,但建议始终检查Connection。但是我知道连接很好,因为当我将TransactionOption属性更改回其默认值“Supported”时,包运行正常。
有谁知道为什么会这样?我假设它与我正在尝试连接的服务器上的不同设置有关。如果包的任何部分失败,也有人知道确保完全回滚的不同方式。
感谢您阅读
答案 0 :(得分:2)
您需要使用分布式事务处理协调器。
The Distributed Transaction Coordinator (DTC) service coordinates transactions that update two or more transaction-protected resources, such as databases, message queues, files systems, and so on. These transaction-protected resources may be on a single computer or distributed across many networked computers.
因为您尝试在服务器之间建立事务,所以它需要一个服务来协调SQL Server服务。 Here是一篇关于如何做的文章。
确保启动并配置服务,并在Windows防火墙中为服务器之间的服务创建例外。
有关更多信息,请参阅有关交易的这篇文章:http://www.mssqltips.com/tip.asp?tip=1585
此外,您可能需要更多地了解MSDTC如何与SSIS相关联以解决您的问题。
答案 1 :(得分:0)
另一种选择:
利用OLE DB连接的RetainSameConnection属性,您可以在多个任务的SSIS中运行常规SQL Server事务,而无需使用分布式事务处理协调器(DTC)。 In this article杰米汤姆森向我们展示了如何。
这意味着您可以在一个执行SQL任务中启动TRANSACTION,然后在另一个执行SQL任务中选择COMMIT或ROLLBACK。