SSIS事务管理MSSQL

Car*_*ngo 5 sql-server ssis transactions

如果复制失败,我需要将数据从DB"source"复制到db"destination",我需要回滚"destination".这两个连接在连接管理器中定义为OLE DB.

这是我目前无法正常工作的尝试.我尝试使用内置的事务管理(将任务事务设置为必需),但这只是无法连接到"目标".

目的地已将"RetainSameConnection"设置为true,而对于"source",这是没有特殊原因的.

我还设置了"MaxConcurrentExecutables"= 1来阻止SSIS执行我的回滚作为第一件事.

序列中的每个任务都设置为"隔离级别"= ReadUncommitted和"transactionOption"=支持.

"失败的脚本"是一个总是失败的脚本,以便我测试事务是否正常.

在此输入图像描述

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

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

回滚失败,"回滚事务请求没有相应的'BEGIN TRANSACTION'"

Pet*_*ter 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任务,它根据时间或者a删除刚刚插入的数据.SELECT MAX(ID),它最适合您的要求.