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

use*_*759 4 ssis

我有一个在序列容器中添加了3个并行数据流任务的程序包。我需要实现事务,以便在所有3个数据流任务都成功执行的情况下完成事务。如果任何数据流任务失败,则事务应回滚。

我正在测试此程序包,但无法正常工作。

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

  • 在序列容器的属性中,我设置了以下属性

    Transaction: supported

    Isolation: readcommited

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

    Transaction: supported

    Isolation: readuncommited

  • 当我运行该程序包时,数据流任务1失败,但是仍将插入并提交到数据流任务2中的数据。

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

bil*_*nkc 5

我同意其他答案,您的问题需要将封闭容器上的交易范围设置为Required。除非您更改了内部对象,否则它们的默认事务处理级别是Supported指它们将在可用的情况下加入事务处理。一个Required设置将启动一个事务和完整性,NotSupported表明该可执行文件/容器将忽略任何现有的交易可能导致这取决于你的设计死锁。

我构建了一个示例程序包,该程序包将删除并重新创建目标表以验证事务是否按预期进行。包中有3个数据流,每个数据流都会向表(1、2、4)添加一个唯一值,这样的查询将指示值是否到达目标表。

SELECT count(1) AS rc, sum(T.col1) AS Total FROM dbo.TrxTest T
Run Code Online (Sandbox Code Playgroud)

如您所见,有7个变量,成对存在3个。FailDataFlow命名为1的布尔值允许任何唯一的数据流失败/成功。这是通过在相应查询的where子句中导致被0除的异常来实现的。

数据流描述

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

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

在此处输入图片说明

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

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