5

如果复制失败,我需要将数据从数据库“源”复制到数据库“目标”,我需要回滚“目标”。这两个连接在连接管理器中定义为 OLE DB。

这是我目前的尝试,但不起作用。我尝试使用内置的事务管理器(将任务事务设置为required),但这只会导致无法连接到“目的地”。

目的地已设置“RetainSameConnection”= true,而“源”则为 false,没有特殊原因。

我还设置了“MaxConcurrentExecutables”= 1 以阻止 SSIS 作为第一件事执行我的回滚。

序列中的每个任务都设置为“Isolation level”=ReadUncommitted 和“transactionOption”=supported。

“失败脚本”是一个总是失败的脚本,以便我测试事务是否正常工作。

在此处输入图像描述

任务“begin tran”的代码是“BEGIN TRANSACTION”,连接设置为“destination”

任务“rollback tran”的代码是“rollback transaction”,连接设置为“destination”

回滚失败,“回滚事务请求没有对应的‘BEGIN TRANSACTION’”

4

1 回答 1

8

您在这里混合了两个概念。在 SSIS 中有两种实现事务的方法。第一个是 SSIS 事务。在这里,你的包应该设置为TransactionOption = Supported,你的容器应该设置为TransactionOption = Required(这将开始一个事务),然后你的两个数据流任务需要设置为TransactionOption = Supported,这将使它们都加入打开的事务。但是,请不要认为此选项需要分布式事务协调器,并且没有办法解决这个问题。

实现事务的第二种方法是使用 SQL Native Transactions。在这里,您将有一个启动事务的执行 SQL 任务,然后是数据流任务,然后是另一个提交事务的执行 SQL(当然还有另一个回滚)。这里的问题是,我刚刚提到的所有任务都需要使用相同的连接管理器,并且retainsameconnection = True在该连接管理器上,否则它将无法工作,因为 SSIS 和 SQl Server 仍然将其视为分布式事务,即使尽管它们不在同一台服务器上,但您必须使用 BEGIN DISTRIBUTED 事务,这又需要分布式事务协调器。我还记得分布式本机 SQL 事务在 SSIS 中无法正常工作。

简短的回答是,您无法实现您在 SSIS 中尝试对事务执行的操作。另一种方法是使用补偿块。SELECT MAX(ID)在这里,如果插入失败,您将有一个执行 SQL 任务,它根据最适合您的要求的时间或 a 删除刚刚插入的数据。

于 2012-10-22T16:56:24.737 回答