【问题标题】:SSIS - Sql transaction rollback throwing errorSSIS - Sql事务回滚抛出错误
【发布时间】:2017-08-24 20:01:05
【问题描述】:

我创建了一个带有 for 循环容器 的 SSIS 2012 包,该包计划连续运行(无限循环),以便它可以在将传入的 Excel 文件放入指定的放置目录后立即处理它.该处理包括首先清除目标 SQL Server 2012 数据库表中的所有现有记录,然后将 Excel 中的数据批量插入到表中。所以显然它需要维护事务,以便在批量插入失败的情况下(由于文件数据无效等)可以回滚数据删除操作。

以下是 for 循环容器中的任务:

  1. 脚本任务,它利用 C# FileSystemWatcher 监视拖放到放置文件夹的 Excel 文件。

  2. 使用以下语句执行 SQL 任务

开始事务 tran1;

  1. 数据流任务,使用 Excel 源和 OLEDB 目标将数据从 Excel 插入 SQL Server 数据库表。此任务有一个 OnError 错误处理程序,它使用执行 SQL 任务将错误详细信息记录到用户定义的错误日志表中。

  2. 在上述成功优先约束条件下,执行 SQL 任务与以下语句:

提交事务 tran1;

  1. 在上述 #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


【解决方案1】:

我能够通过将故障优先约束从 DFT 更改为 Rollback EST 从 Logical AND 更改为 Logical OR 来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多