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 中的数据仍在插入和提交中。

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

4

3 回答 3

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 异常来实现的。

数据流描述

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

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

在此处输入图像描述

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

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

于 2012-04-29T18:56:07.403 回答
0

你做的几乎所有事情都是正确的。

首先,忽略事务隔离级别,它在 readcommited 上有一个错误,如果你想这样做,你必须手动进行,请参阅我在这篇文章中的回答作为示例。

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

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

于 2012-04-29T18:18:13.727 回答
0

您必须为序列容器设置事务选项 =required 并为所有数据流任务设置 =supported 才能实现所需。

我总是做的是设置事务选项=包级别所需并支持所有其他任务。所以如果任何任务失败,事务就会回滚..

于 2012-04-29T07:13:12.523 回答