7

我有一个非常简单的 SSIS 包,只是一个数据导入和一个执行 SQL 任务。如果包的任何部分失败,我想回滚所有内容,因此我将这些任务放在序列容器中,并将序列容器 TransactionOption 属性设置为“必需”,并将 FailPackageonFailure 属性设置为“真”。当我以本地数据库为目标时,这工作得很好。但是,当我尝试将 OLE DB 连接更改为远程服务器时,上述属性设置会导致程序包挂起并最终失败并显示“无法获取连接”消息。我在网上看到过关于这个问题的类似描述,但建议总是检查连接。但是我知道连接很好,因为当我将 TransactionOption 属性更改回其默认值'

有谁知道为什么会发生这种情况?我假设它与我尝试连接的服务器上的不同设置有关。如果包的任何部分失败,是否有人知道确保完全回滚的不同方法。

谢谢阅读

4

2 回答 2

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 服务。是一篇关于如何做到这一点的文章。

确保启动和配置服务,并在 Windows 防火墙中为服务器之间的服务创建例外。

有关更多信息,请参阅有关事务的文章:http ://www.mssqltips.com/tip.asp?tip=1585

此外,您可能需要更多地了解 MSDTC 如何与 SSIS 相关,以解决您的问题。

于 2013-05-15T00:11:24.353 回答
0

另外的选择:

利用 OLE DB 连接的 RetainSameConnection 属性,您可以在 SSIS 中针对多个任务运行常规 SQL Server 事务,而无需使用分布式事务协调器 (DTC)。在这篇文章中, Jamie Thomson 向我们展示了如何做。

这意味着您可以在一个执行 SQL 任务中开始事务,然后在另一个执行 SQL 任务中选择提交或回滚。

于 2013-12-19T04:22:41.360 回答