我在序列容器中添加了一个包含 3 个并行数据流任务的包。我需要实现这样的事务,如果所有 3 个数据流任务都成功执行,则事务完成。如果任何数据流任务失败,那么事务应该回滚。
我正在测试这个包,但它不起作用。
sequence container
并拖放 data flow task 1
, data flow task 2
和 data flow task 3
并配置了所有三个数据流任务。 Transaction: supported
Isolation: readcommited
Transaction: supported
Isolation: readuncommited
即使数据流任务之一失败,如何防止数据流任务提交事务?
最佳答案
我同意其他答案,您的问题要求您将封闭容器上的事务范围设置为 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 命名的是 bool 值,允许任何唯一的数据流失败/成功。这是通过在相应查询的 where 子句中引起除以 0 异常来实现的。
序列容器的 TransactionOption 为
Required
.各个数据流保留其默认的 TransactionOption Supported.
第一次执行导致无法与分布式事务协调器通信,因为它被设置为在此 VM 上手动启动。纠正该问题导致包正确失败,因为“DFT 值 2”生成了除以零异常。尽管“DFT 值 1”上有一个绿色框,但运行上面的查询方式在我的表中没有显示任何内容。
将 FailDataFlow1 的值切换为 False 并重新运行在我的查询中分别显示了 3 和 7 的值,这表明所有行都已到达。
您可以通过更改各种容器/可执行文件上的事务选项来进一步探索,以确保他们像其他受访者所指出的那样工作。
关于ssis - 如何在同一事务中并行运行多个数据流任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369943/