父子包中的事务控制ssis

时间:2015-07-02 16:31:59

标签: sql-server ssis transactions parent-child

我有父包我在其中有foreach循环来计算平面文件,在其中我逐个处理每个文件,同时调用(Exec包任务)子包,其中我有序列容器。在子包序列容器中,我有两个流程任务 -one用于从导入模式表中删除数据,并将平面文件中的所有数据导入到父包传递的数据中。 -second将新的和更新的行从导入模式移动到相对的分段模式表。

现在我设置"必需"父控制流的事务属性,而其中的所有其他组件都是"支持"。 并设置"支持"子控制流的事务属性,对于其中的所有组件都是相同的。因此,当我执行父包时,它会停留在子包中的第二个流程任务中。

如果任何pacakge发生任何故障或错误,我想回滚所有交易。

请任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

如果SSIS交易不适合您,请考虑重新设计包设计。是否有可能在最终将数据提交到最终结果表之前多次拆分步骤和分段数据。

老实说,我从不使用交易。对于ETL过程,我将其分为4个独立的关注区域:

  1. Extract - 从源获取数据,并将其物理地放置在表中。登台表看起来与源表完全相同。这可以最大限度地减少源系统中的锁定中断。
  2. 清理 - 在不考虑其他表的情况下清理数据。清洁可以在视图中进行,也可以使用单独的包进行清理。
  3. Conform - 将来自多个来源的数据放入一个表中。该表看起来像目标表(即事实,维度)
  4. 加载 - 加载到最终结果表中,仅关注加载以最大限度地减少对最终用户访问表的中断。
  5. 我为这些软件包构建了可重启性,这样如果他们完成了前几个步骤,就不需要重新开始了。他们可以从他们离开的地方继续前行并完成ETL过程。

    如果我要提取多个文件,我会为每个文件构建一个包。如果有一系列具有相同模式的文件需要循环播放。我会考虑重新启动性来构建流程。那就是:

    1. 截断登台表
    2. 一次性或并行地将一个文件提取到临时表中
    3. 归档文件
    4. 如果流程失败,在这种情况下,我们可以从顶部开始。因为我们正在将数据转储到临时表(可以是堆)中,所以这可以是一个超级快速有效的过程。

      如果您主要担心的是您不希望特定的结果表处于不一致状态,那么通过暂存数据,您可以轻松地将最终的插入/更新过程包装到SQL事务中。

      这是非常一般的建议,但它的要点是,不要使用事务,将流程分解为步骤,并在实际需要的地方使用SQL事务。希望这会有所帮助。