【发布时间】:2017-08-24 20:01:05
【问题描述】:
我创建了一个带有 for 循环容器 的 SSIS 2012 包,该包计划连续运行(无限循环),以便它可以在将传入的 Excel 文件放入指定的放置目录后立即处理它.该处理包括首先清除目标 SQL Server 2012 数据库表中的所有现有记录,然后将 Excel 中的数据批量插入到表中。所以显然它需要维护事务,以便在批量插入失败的情况下(由于文件数据无效等)可以回滚数据删除操作。
以下是 for 循环容器中的任务:
脚本任务,它利用 C# FileSystemWatcher 监视拖放到放置文件夹的 Excel 文件。
使用以下语句执行 SQL 任务:
开始事务 tran1;
数据流任务,使用 Excel 源和 OLEDB 目标将数据从 Excel 插入 SQL Server 数据库表。此任务有一个 OnError 错误处理程序,它使用执行 SQL 任务将错误详细信息记录到用户定义的错误日志表中。
在上述成功优先约束条件下,执行 SQL 任务与以下语句:
提交事务 tran1;
- 在上述 #3 的失败优先约束条件下,Execute SQL Task 使用以下语句:
回滚事务 tran1;
请注意,我不能使用默认的基于 DTC 的事务,因为数据库服务器中未启用 MSDTC。因此使用本机 SQL 事务。此外,我在所有与 DB 相关的任务中使用单个 OLEDB 连接管理器(它是一个远程 Sql Server 数据库,因此使用 OLE DB)。 Oledb 连接管理器的 RetainSameConnection 属性设置为 True。此外,所有与数据库相关的任务都将其事务选项设置为支持。 但是,在使用包含无效数据的传入 Excel 文件运行包时,用于回滚的任务 #5 会引发以下错误,并且同样会记录到错误日志表中:
ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION
我应该补充一点,对于一个有效的 Excel 文件,包运行良好,提交事务(任务 #4)完成且没有错误。 知道什么可能导致事务回滚抛出错误吗?
【问题讨论】:
-
我怀疑事务在 SSIS 中是否会像这样工作。开始事务范围是一项任务,要么尝试在不同的任务中提交/回滚。
-
这就是连接管理器的 RetainSameConnection 属性设置为 true 并且所有任务都使用同一个连接管理器的原因。
-
另外,我最初创建的包没有 for 循环容器,也没有 DFT 的 OnError 错误处理程序,当时提交事务和回滚事务任务都成功运行。因此,只要 RetainSameConnection 为真,在一项任务中开始事务并在另一项任务中提交/回滚肯定有效。
-
我刚刚使用您的步骤创建了一个示例包,它对我有用。
-
能否分享解决方案让我看看?
标签: ssis sql-server-2012 sql-server-data-tools ssis-2012 sqltransaction