2012-04-29 111 views
4

我有一个包含3个并行数据流任务的包添加到序列容器中。我需要实现事务,如果所有3个数据流任务都成功执行,则事务完成。如果任何数据流任务失败,则事务应该回滚。如何在同一事务中并行运行多个数据流任务?

我正在测试这个软件包,但它不工作。

  • 我花了一sequence container和拖放data flow task 1data flow task 2data flow task 3和配置的所有三个数据流任务。

  • 在sequencee容器的属性,我已经设置了以下属性

    Transaction: supported

    Isolation: readcommited

  • 在三个数据流任务的属性,我已经设置了以下属性

    Transaction: supported

    Isolation: readuncommited

  • 当运行该程序包,所述数据流任务1失败,但数据转换成数据流任务2仍然被插入并提交。

如何防止数据流任务提交事务,即使其中一个数据流任务失败?

+0

你在D(编程语言)中做你的项目吗? o.O – DejanLekic 2012-04-29 10:37:29

回答

0

您必须设置序列容器所需的事务选项=和所有数据流任务所支持的=来实现您所需要的。

我总是做的是设置事务选项=所需的包装水平,并支持所有其他tasks.So,如果任何任务失败事务回滚..

+0

我遵循你曾经给过的任何指示,但它没有工作。那时候所有的任务好行也是它的失败.plz告诉我如何实现。 – user1363759 2012-04-29 09:09:43

+0

我遵循任何你给的指示,但它不工作。那时如果好的行来源的水平,那时它的成功。假设任何任务失败的时候它不回滚.plz如何我acchive。 – user1363759 2012-04-29 09:37:52

0

你正在做的几乎一切正常。

首先,忽略事务隔离级别,它有一个readcommited的错误,如果你想这样做,你必须手动完成它,看看我的回答this后作为例子。

但我不明白你为什么要配置隔离级别,你的问题显然可以用隔离级别来解决。缺少的东西是将事务设置为序列容器上的必需项。将它们设置为Supported表示该任务不会启动事务,但会加入由其父容器启动的任何事务(如果它退出)。

因此,通过将事务设置为序列容器上的必需条件并支持数据流,它应该可以工作。

4

我同意其他答案,您的问题需要您将封闭容器上的交易范围设置为Required。除非您更改了内部对象,否则它们的默认交易级别为Supported,这意味着它们将在可用的交易中登记。 A 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除法异常来实现的。

data flow description

序列容器具有一个Required的TransactionOption。各个数据流保留默认的TransactionOption Supported.

第一次执行导致无法与分布式事务协调器进行通信,因为它在此VM上被设置为手动启动。纠正这个问题导致软件包正确地失败,因为“DFT值2”产生一个零除异常。运行上述查询方式,即使在“DFT值1”上存在绿色框,我的表格中也没有显示任何内容。

enter image description here

FailDataFlow1的值转换为False,重新运行分别显示在我的查询这表明所有行抵达的3和7的值。

您可以通过更改各种容器/可执行文件上的事务选项来进一步探索,以确保他们正在像其他受访者指示的那样工作。

相关问题