我开始编写自己的示例来回答您的问题。然后我记得我在新罕布什尔州的一个 SQL 星期六谈话时遇到了马特梅森。他是 SSIS 的 Microsoft 项目经理。
虽然我在 2009 年到 2011 年间花了 3 年时间只写 ETL 代码,但我认为 Matt 有一篇文章。
http://www.mattmasson.com/2011/12/design-pattern-avoiding-transactions/
这是您发现的方法和错误的高级摘要。
[错误]
您发现的错误与 MSDTC 有问题有关。这必须配置并正常工作,没有任何问题。常见问题是防火墙。看看这篇文章。
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/3a5c847e-9c7e-4628-b857-4e6edaa7936c/sql-task-transaction-required?forum=sqlintegrationservices
[解决方案 1] - 在包、任务或容器级别使用事务。
一些数据提供者不支持 MSDTC。有些任务不支持事务。这可能会降低性能,因为您要添加一个新层来支持两阶段提交。
http://technet.microsoft.com/en-us/library/aa213066(v=sql.80).aspx
[解决方案 2] - 使用以下任务。
A - 开始传输(执行 SQL)
B - 您的数据流
C - 测试返回码
1 - 好 = 提交(执行 SQL)
2 - 失败 = 回滚(执行 SQL)
您必须将连接上的 RetainSameConnection 属性设置为 True。
这会强制所有呼叫通过一个会话或 SPID。所有事务管理现在都在服务器上。
[解决方案 3] - 编写所有代码,使其可重新启动。这并不意味着你出去使用检查站。
一种解决方案是始终使用 UPSERTS。插入新数据。更新旧数据。删除只是表中的一个标志。这种模式允许多次执行失败的作业,并达到相同的最终状态。
另一种解决方案是通过将所有错误行放入医院表中进行手动检查、更正和插入来处理它们。
为什么不使用数据库快照(跟踪刚刚更改的记录)?在 ETL 作业之前拍摄快照。如果发生错误,请从快照中恢复数据库。最后一步是从系统中删除快照以清理房屋。
简而言之,我希望这是足够的想法来帮助你。
虽然交易选项很好,但确实有一些下跌。如果你需要一个例子,只需 ping 我。
真挚地
Ĵ