SSIS:为​​什么序列容器需要TransactionOption Required才能报告任务失败?

时间:2018-11-26 23:18:22

标签: sql-server ssis

我有一份工作,可以从各种非数据库源在网络文件夹上创建文件。在工作中,我将各种文件创建任务(包含在序列容器中)与移动文件任务(foreach枚举器)隔离开,以防止各种文件创建任务的蜘蛛网优先约束:

  1. 数据流任务,其中包含使用C#和LDAP从Active Directory中提取数据并将其输出到多个文件的脚本组件
  2. 从SFTP下载文件的脚本组件(实现WinSCPNET.dll)

成功完成之后,序列容器将转到foreach文件枚举器,将提取的文件移动到表明文件已准备好加载的文件夹中-此处没有问题。

但是,在生产中出现了一个间歇性问题,其中AD连接在文件提取过程完成之前就终止了,从而导致了部分文件(这在测试中没有观察到,但应该考虑到,这很糟糕)。因此,我在序列容器外部添加了具有故障优先级约束的foreach枚举器,以删除这些部分提取文件。

在测试此修复程序期间,我在序列容器中设置了一项任务来报告失败。最初,序列容器报告成功,因此绕过了delete foreach枚举器。我尝试将MaximumErrorCount从0设置为1,但这没有导致所需的行为更改。然后,我将序列容器的TransactionOption从受支持的更改为必需,这似乎已经解决了该问题。现在,此作业将移动完全提取的文件,同时删除报告提取错误的文件。

我的问题是:这条路线是否存在潜在的问题?我不确定为什么该解决方案有效。在线文档在与数据库的连接上下文中讨论了TransactionOption。但是,在这种情况下,没有与数据库的连接。我只是不想发布一个补丁,它可能包含一个我不知道的潜在错误。

1 个答案:

答案 0 :(得分:1)

关于事务和文件。
假定您使用NTFS或其他支持事务的文件系统将文件写入磁盘。然后,所有文件创建和文件保存操作都包含在一个事务中。如果由于任务失败而导致事务失败,则将回滚事务内部创建的所有文件,即将其删除。
因此,您将对文件采用“全有或全无” 的方法,仅在所有提取工作完成后才接收文件。
如果您将文件存储在非事务性文件系统上,例如旧FAT,则此“全有或全无” 将不再起作用,并且您会收到部分文件。在Sequence上设置的交易不会产生任何影响。