如何在同一事务中并行运行多个数据流任务?

时间:2012-04-29 05:30:19

标签: ssis

我有一个包含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。

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

3 个答案:

答案 0 :(得分:5)

我同意其他答案,您的问题要求您将封闭容器上的事务范围设置为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异常来实现的。

data flow description

序列容器的TransactionOption为Required。各个数据流保留其Supported.

的默认TransactionOption

第一次执行导致无法与分布式事务协调器通信,因为它已设置为在此VM上手动启动。纠正该问题导致包正确地失败,因为“DFT值2”产生除以零的异常。尽管在“DFT值1”上存在绿框,但运行上面的查询方式在我的表中没有显示任何内容。

enter image description here

将FailDataFlow1的值切换为False并重新运行在我的查询中分别显示3和7的值,表示所有行已到达。

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

答案 1 :(得分:0)

您必须为序列容器设置transaction option = required,并为所有数据流任务支持=以实现您的需要。

我一直在做的是设置包级别所需的事务选项=并支持所有其他任务。因此,如果任何任务失败,事务将回滚...

答案 2 :(得分:0)

你几乎正在做的一切。

首先,忽略事务隔离级别,它有readcommited的错误,如果你想这样做,你必须手动完成,请参阅我在this帖子上的答案。

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

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