我有一个包含3个并行数据流任务的包在序列容器中添加。我需要实现事务,如果所有3个数据流任务都成功执行,则事务完成。如果任何数据流任务失败,那么事务应该回滚。
我正在测试这个软件包,但它不起作用。
我选了一个sequence container
并拖放data flow task 1
,data flow task 2
和data flow task 3
并配置了所有三个数据流任务。
在sequencee容器的属性中,我设置了以下属性
Transaction: supported
Isolation: readcommited
在三个数据流任务的属性中,我设置了以下属性
Transaction: supported
Isolation: readuncommited
当我运行包时,数据流任务1失败,但仍然插入并提交了数据到数据流任务2。
即使其中一个数据流任务失败,如何防止数据流任务提交事务?
答案 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异常来实现的。
序列容器的TransactionOption为Required
。各个数据流保留其Supported.
第一次执行导致无法与分布式事务协调器通信,因为它已设置为在此VM上手动启动。纠正该问题导致包正确地失败,因为“DFT值2”产生除以零的异常。尽管在“DFT值1”上存在绿框,但运行上面的查询方式在我的表中没有显示任何内容。
将FailDataFlow1的值切换为False并重新运行在我的查询中分别显示3和7的值,表示所有行已到达。
您可以通过更改各种容器/可执行文件的事务选项来进一步探索,以确保自己的工作正如其他受访者所指示的那样。
答案 1 :(得分:0)
您必须为序列容器设置transaction option = required,并为所有数据流任务支持=以实现您的需要。
我一直在做的是设置包级别所需的事务选项=并支持所有其他任务。因此,如果任何任务失败,事务将回滚...
答案 2 :(得分:0)
你几乎正在做的一切。
首先,忽略事务隔离级别,它有readcommited的错误,如果你想这样做,你必须手动完成,请参阅我在this帖子上的答案。
但我不明白你为什么要配置隔离级别,你的问题显然可以通过隔离级别来解决。您缺少的是将事务设置为序列容器上的必需项。将它们设置为Supported意味着该任务不会启动事务,但会加入由其父容器启动的任何事务(如果它已退出)。
因此,通过将事务设置为序列容器上的required并在数据流上受支持,它应该可以工作。