【发布时间】:2020-09-30 21:30:00
【问题描述】:
我有一个任务,它从截断目标表开始,然后进入数据流任务。在数据流任务中,我有一个源文件,然后通过 OLE db 目标将其加载到目标表,如果成功,它会提交事务,如果出现错误,它会回滚事务,包括被截断的表。无论如何我可以取消序列容器并且仍然有一个开始事务以及回滚和提交事务?请提供替代方案,我将给予高度评价。先感谢您。
【问题讨论】:
标签: sql ssis script-task
我有一个任务,它从截断目标表开始,然后进入数据流任务。在数据流任务中,我有一个源文件,然后通过 OLE db 目标将其加载到目标表,如果成功,它会提交事务,如果出现错误,它会回滚事务,包括被截断的表。无论如何我可以取消序列容器并且仍然有一个开始事务以及回滚和提交事务?请提供替代方案,我将给予高度评价。先感谢您。
【问题讨论】:
标签: sql ssis script-task
由于它现在可以工作,如果 SQL Truncate Table 步骤或 SQL Insert Data Into 步骤失败,则将触发回滚分支。
如果这些任务都没有,或者序列容器本身产生了失败,那么“SQL Commit Transaction”的成功路径将执行。
要删除序列容器,SQL Insert Data Into 中的成功先例约束将直接映射到 SQL Commit Transaction。
SQL Truncate Table 和 SQL Insert Data Into 的失败路径将映射到 SQL Rollback Transaction。此时,触发 SQL 回滚事务的唯一方法是截断和插入数据都失败。从逻辑上讲,这不可能发生,因此您需要将失败先例约束修改为 OR 条件。
我相信您有正当理由进行此修改,但如果我参与了这个项目,我会主张保持模式不变,而不是使事情复杂化。从视觉上看,我可以看到序列容器中的任务旨在成为一个原子单元——要么全部工作,要么被重置。将其分解成单独的部分会减损这一点。不过,我确实对 Jamie Thomson 的任务命名约定给予满分。
【讨论】:
SSIS 通过 MS Distributed Transaction Coordinator 提供事务支持。它有一些限制并且有性能开销,但它可以工作。事务可以在单个任务或Sequence Container的范围内指定,即如果Sequence Container的所有步骤都没有错误,则事务将被提交,否则事务将回滚。它是自动完成的,无需执行特殊的回滚任务。
有些人不喜欢 DTC 或在设置它时遇到问题,并尝试使用本机 MS SQL 事务,这些事务由 BEGIN TRAN、COMMIT TRAN 和 ROLLBACK TRAN 命令处理。根据我的经验,只有当您可以将所有数据操作操作都放在一个 SQL 任务命令中时,这种方法才有效。
如果您必须使用多个 SSIS 任务并希望在其上设置 MS SQL 事务,这里有一些限制和指南:
RetainSameConnection=true 属性底线 - 我更喜欢使用 MS DTC,尽管它会带来性能损失和设置复杂性。跨多个任务的本机 MS SQL 事务显示其本身不稳定且不可靠,处理它的唯一方法 - 将其放在一个 SQL 命令中。
【讨论】: