【问题标题】:SSIS: Why does sequence container require TransactionOption Required in order to report task failure?SSIS:为​​什么序列容器需要 TransactionOption 才能报告任务失败?
【发布时间】:2018-11-26 23:18:22
【问题描述】:

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

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

成功完成后,序列容器会转到 foreach 文件枚举器,将提取的文件移动到指示文件已准备好加载的文件夹 - 这里没有问题。

但是,生产中出现了一个间歇性问题,即 AD 连接在文件提取过程完成之前终止,从而导致部分文件(在测试中没有观察到这种情况,但应该考虑到 - 我的错)。所以,我在序列容器之外添加了一个 foreach 枚举器,它带有一个失败优先约束来删除这些部分提取文件。

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

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

【问题讨论】:

    标签: sql-server ssis


    【解决方案1】:

    关于事务和文件。
    假设您使用 NTFS 或其他支持事务的文件系统将文件写入磁盘。然后所有文件创建和文件保存操作都包含在一个事务中。如果由于任务失败而导致事务失败,则在事务中创建的所有文件都将被回滚,即删除。
    因此,您将对文件采用“全有或全无” 方法,仅当所有提取都成功时才接收文件。
    如果您将文件存储在非事务性文件系统(如旧 FAT)上,此“全有或全无”将不再起作用,您将收到部分文件集。在 Sequence 上设置的事务将没有这样的效果。

    【讨论】:

    • 这是有道理的——如果微软扩展他们的文档来涵盖这一点将会很有帮助。但是,我离题了。无论如何,我继续禁用删除 foreach 枚举器,发现当任务报告失败时文件没有被删除。所以,我仍然需要这一步。但是,很高兴了解此解决方案为何有效。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多