如何在我的帖子中解释的场景中在 SSIS 中一起使用 Transactionoption 和检查点功能?

问题描述

我一直在尝试了解 SSIS 中的检查点功能。对于此实现,我包含以下配置:

  1. 我按照与优先约束相关的顺序执行了 4 个 execute-sql-task:成功;第 3 个 execute-sql-task 将在第一次尝试中失败,因此我将修复错误并重新运行包以观察检查点功能行为

  2. 对于包,transactionoption:Supported,对于每个execute-sql-task,transactionoption:Supported

  3. 在包属性上设置检查点配置如下:

  • CheckPointFileName:文件路径
  • CheckPointUsage:ifExists
  • SaveCheckPoints:真
  1. 为每个 execute-sql-task 设置属性
  • FailPackageonFailure:True

使用此配置,对于第一次运行的包,前 2 个任务在 sqlserver 中的表上更新执行,第 3 个任务失败,第 4 个任务根本没有启动,因为它具有优先约束:成功与它的优先约束任务;检查点文件已创建,我修复了错误并重新运行了包。这一次,只有任务 3 与更新数据库的任务 4 一起执行;这清楚地显示了 Checkpoint 的预期行为。

但是,然后我对 4 个任务中的每一个都对 Transactionoption:required 进行了更改,并将 Transactionoption:Supported 打包;我执行了两次包以观察检查点行为。在这里,我进行了观察 --- 尽管任务 1 和任务 2 在第一次运行中成功,但它们在第二次运行中与任务 3 和任务 4 一起再次执行,并在我的表上进行了更新。我相信,通过 Checkpoint 配置,包必须从失败的任务开始(并执行以下未执行的任务);这没有按预期发生。

嗯,简而言之,我关心的是,这两种情况之间有什么区别,比如说, 场景01----
A) Package Transactionoption:supported -- B) 每个 Execute-sql-tasks Transaction:supported -- C) 检查点:已配置

场景 02 --- A) Package Transactionoption:supported -- B) 每个 Execute-sql-tasks Transaction:required -- C) 检查点:已配置。

有人能帮我理解这个场景吗?感谢您给予的宝贵支持

解决方法

阅读微软Documentation on Checkpoints,有以下注意事项。

在同一个包中使用检查点和事务可能会导致意外结果。例如,当包失败并从检查点重新启动时,包可能会重复已成功提交的事务。

检查点功能还有其他限制,例如不支持 For Each 循环。数据流将完全重新运行,检查点不会捕获数据流中间状态。

Checkpoint 是一个有局限性的好工具;它不是包有状态重启的灵丹妙药。