执行回滚或提交事务的另一种方法

问题描述

我有一个任务,该任务以截断目标表开始,然后进入数据流任务。在数据流任务内部,我有一个文件,该文件然后通过OLE db目标加载到目标表,如果成功,它将提交事务,如果发生错误,它将回滚包括被截断的表的事务。无论如何,我可以取消序列容器,但仍然具有开始事务以及回滚和提交事务吗?请提供其他选择,我会给予高度评价。先感谢您。

enter image description here

解决方法

目前,如果SQL截断表步骤或SQL插入数据插入步骤失败,则将触发回滚分支。

如果这些任务或序列容器本身均未生成失败,则将执行“ SQL提交事务”的成功路径。

要删除序列容器,SQL Insert Data Into中的成功先例约束将直接映射到SQL Commit Transaction中。

从SQL截断表和SQL插入数据到的故障路径将映射到SQL回滚事务。此时,将触发SQL回滚事务的唯一方法是同时截断和插入数据失败。从逻辑上讲,这不可能发生,因此您需要将失败先例约束条件修改为OR条件。

我确定您有进行此修改的正当理由,但是如果我参与了这个项目,我会提倡按原样保留模式,而不是使事情复杂化。从视觉上看,我可以看到序列容器中的任务旨在成为一个原子单元-要么全部起作用,要么被重置。将其拆分为多个部分会降低这一点。不过,我确实为任务上的Jamie Thomson命名约定打了满分。

,

SSIS通过MS Distributed Transaction Coordinator提供事务支持。它有一些局限性,并且有性能开销,但是可以工作。可以在单个任务或序列容器的范围内指定事务,即,如果序列容器的所有步骤都正常运行,则将提交事务,否则将回滚事务。它是自动完成的,无需执行特殊的回滚任务。
有些人不喜欢DTC或在设置它时遇到问题,然后尝试使用本机MS SQL事务,这些事务通过BEGIN TRANCOMMIT TRANROLLBACK TRAN命令进行处理。以我的经验,只有将所有数据操作操作都放在一个SQL Task 命令中,这种方法才行得通。
如果必须使用多个SSIS任务并希望在其上设置MS SQL事务,则有一些限制和准则:

  • MS事务位于连接会话中,它可以生成多个连接(在这种情况下,它将成为分布式事务)。意思是:
    1. 您必须在连接管理器上指定RetainSameConnection=true属性
    2. 您必须将任务和数据流设计为仅使用一个连接。如果您在源和目标访问同一数据库(同一连接管理器)的地方使用数据流,那么您会很不走运,这将创建两个数据库连接并中断事务。对于DataFlow内部的查找,同样存在问题。
  • 在SSIS和本地MS Transaction中使用临时表是PITA。

底线-尽管性能下降和设置复杂,我还是更喜欢使用MS DTC。跨多个任务的本机MS SQL事务显示其自身不稳定且不可靠,这是处理该任务的唯一方法-将其放在一个SQL Command中。