我有一个序列容器中加入3-并行数据流的任务包。 我需要这样的交易如果所有的3个数据流任务执行成功完成实现交易。 如果任何数据流任务的失败,那么事务应该回滚。
我测试这个包,但它不工作。
我花了一个sequence container
和拖放data flow task 1
, data flow task 2
和data flow task 3
和配置的所有三个数据流任务。
在sequencee容器的属性,我已经设置了以下属性
Transaction: supported
Isolation: readcommited
在三个数据流任务的属性,我已经设置了以下属性
Transaction: supported
Isolation: readuncommited
当我运行该程序包,数据流任务1失败,但是该数据到数据流任务2仍然被插入和承诺。
我怎样才能防止犯即使数据流任务一个失败的交易数据流任务?
我同意其他的答案,你的问题需要你设定的交易范围的封闭容器上的Required
。 除非你已经改变了内部的对象,它们的默认事务级别的Supported
,这意味着如果有,他们将在一个事务中登记。 一个Required
设置将启动一个事务和完整性, NotSupported
表示可执行/容器将忽略任何现有的交易可能导致这取决于你的设计死锁。
我内置的是,删除并重新创建目标表,以验证预期的交易行为的样本包。 有在封装3的数据流,每一个添加一个唯一的值表中(1,2,4),以使得这样的查询将指示值是否在目标表到达。
SELECT count(1) AS rc, sum(T.col1) AS Total FROM dbo.TrxTest T
正如你所看到的,有7个变量,3对。 的那些FailDataFlow命名都是布尔型,允许任何独特的数据流失败/成功。 这是通过使分频相应的查询的where子句中完成由0例外。
序列容器具有的的TransactionOption Required
。 单个数据流保留其默认的TransactionOption Supported.
第一执行导致了无法因为它被设置为在该VM手动启动与分布式事务协调器进行通信。 校正该问题导致了包正确地失败输出为“DFT值2”零异常产生的鸿沟。 运行查询方式上面显示我在我的表,尽管一个绿色盒子的“DFT值1”的存在。
FailDataFlow1的值转换为False,重新运行分别显示在我的查询这表明所有行抵达的3和7的值。
您可以通过改变各种容器/可执行交易选项,以确保自己与其他受访者表示,他们正在进一步探索。
你必须设置交易选项=为序列容器=支持所有数据流任务,实现你所需要的要求。
我经常做的是设置事务选项=所需的包装水平,并支持所有其他tasks.So,如果任何任务失败事务回滚..
你是做正确几乎所有的东西。
首先,忽略事务隔离级别,但对readcommited一个错误,如果你想这样做,你必须做手工,看到我的回答这个职位的一个例子。
但我不明白为什么你应该配置隔离级别,你的问题显然可以用隔离级别解决。 你缺少的东西是给交易设置序列容器上必需的。 将它们设置为支持意味着该任务不启动一个事务,但加入由其父容器启动的任何事务,如果它退出。
因此,通过该交易设置为序列容器上需要和支持你的数据流,它应该工作。
文章来源: How do I run multiple data flow tasks in parallel within the same transaction?