如果复制失败,我需要将数据从DB“source”复制到db“destination”,我需要回滚“destination”。这两个连接在连接管理器中定义为OLE DB。
这是我目前无效的尝试。我尝试使用内置的事务管理(将任务事务设置为必需),但这只是无法连接到“目标”。
目的地已将“RetainSameConnection”设置为true,而对于“来源”,这是无效的。
我还设置了“MaxConcurrentExecutables”= 1,以阻止SSIS执行我的回滚作为第一件事。
序列中的每个任务都设置为“隔离级别”= ReadUncommitted和“transactionOption”=支持。
“失败的脚本”是一个总是失败的脚本,以便我测试交易是否有效。
任务“begin tran”的代码是“BEGIN TRANSACTION”,连接设置为“destination”
任务“rollback tran”的代码是“rollback transaction”,连接设置为“destination”
回滚失败,“回滚事务请求没有相应的'BEGIN TRANSACTION'”
答案 0 :(得分:7)
你在这里混合了两个概念。有两种方法可以在SSIS中实现交易。第一个是SSIS交易。在这里,您的包应设置为TransactionOption = Supported
,您的容器应设置为TransactionOption = Required
(这将开始一个事务),然后您的两个数据流任务需要设置为TransactionOption = Supported
,这将使他们两个加入开放交易。但是,请注意,此选项需要分布式事务处理协调员,并且无法解决此问题。
实现事务的第二种方法是使用SQL Native Transactions。在这里,您将拥有一个启动事务的执行SQL任务,然后是数据流任务,然后是另一个提交事务的执行SQL(当然还有另一个执行回滚)。这里的问题是,要求我刚刚提到的所有任务在该连接管理器上使用相同的连接管理器和retainsameconnection = True
,否则它将无法工作,如SSIS并且SQl Server仍将其视为分布式事务,即使它们不在同一服务器上,您也必须使用BEGIN DISTRIBUTED事务,这又需要分布式事务处理协调器。我还记得,分布式本机SQL事务在SSIS中无法正常工作。
简短的回答是,您无法实现SSIS中的交易尝试。另一种方法是使用补偿块。在这里,如果插入失败,您将有一个执行SQL任务,它根据时间或SELECT MAX(ID)
删除刚刚插入的数据,这些数据最适合您的要求。