如果复制失败,我需要从DB "source“复制数据到db”目的地“,我需要回滚”目的“。这两个连接在连接管理器中定义为OLE DB。
以下是我目前的尝试,但效果不佳。我尝试使用内置的事务管理器(将任务事务设置为required),但这只会导致无法连接到“目的”。
目标设置为"RetainSameConnection“= true,而对于”源“,这是假的,没有特殊的原因。
我还将"MaxConcurrentExecutables“=1设置为阻止SSIS执行回滚作为第一件事。
序列中的每个任务都被设置为“隔离级别”=ReadUncommitted和"transactionOption"=supported。
“失败脚本”是一个总是失败的脚本,以便我测试事务是否正常。

任务"begin“的代码是”“,连接设置为”目的“。
任务"rollback tran“的代码是"rollback事务”,连接设置为“目的”
回滚失败,“回滚事务请求没有相应的‘开始事务’”
发布于 2012-10-22 16:56:24
你在这里混合了两个概念。在SSIS中有两种实现事务的方法。第一个是SSIS事务。在这里,您的包应该设置为TransactionOption = Supported,容器应该设置为TransactionOption = Required (这将开始一个事务),然后您的两个数据流任务需要设置为TransactionOption = Supported,这将使它们都加入打开的事务。但是,请不要认为这个选项需要分布式事务协调器,这是无法避免的。
第二种实现事务的方法是使用SQL本机事务。在这里,您将有一个启动事务的执行SQL任务,然后是数据流任务,然后是提交事务的另一个执行SQL (当然还有另一个要回滚)。这里的问题是,我刚才提到的所有任务都必须使用相同的连接管理器,否则连接管理器上的retainsameconnection = True 将无法工作,因为SSIS和SQl server仍然将其视为分布式事务,即使它们不在同一台服务器上,而且您必须使用开始分布式事务,这再次需要分布式事务协调器。此外,我还记得分布式本机SQL事务在SSIS中不能正常工作。
简单地说,您无法实现在SSIS中使用事务所要做的事情。另一种选择是使用补偿块。在这里,在insert失败时,您将有一个Execute suits,它根据任何一个时间删除您刚刚插入的数据,或者一个SELECT MAX(ID),这是最适合您的需求的。
https://stackoverflow.com/questions/13012358
复制相似问题