SSIS - Sql事务回滚抛出错误

时间:2017-08-24 20:01:06

标签: ssis sql-server-2012 sql-server-data-tools ssis-2012 sqltransaction

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

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

  1. 脚本任务,它利用C# FileSystemWatcher 来监视放入drop文件夹的Excel文件。

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

  3.   

    开始交易tran1;

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

    2. 关于上述成功优先约束,使用以下语句执行SQL任务

    3.   

      提交交易tran1;

      1. 关于上面#3的失败优先约束,使用以下语句执行SQL任务
      2.   

        回滚事务tran1;

        请注意,我无法使用默认的基于DTC的事务,因为数据库服务器中未启用MSDTC。因此使用本机SQL事务。此外,我在所有与DB相关的任务中使用单个OLEDB连接管理器(它是一个远程Sql Server数据库,因此使用OLE DB)。 Oledb连接管理器的 RetainSameConnection 属性设置为True。此外,所有与数据库相关的任务都将其事务选项设置为支持。 但是,在使用包含无效数据的传入Excel文件运行程序包时,用于回滚的任务#5会引发跟随错误,并且同样会记录到错误日志表中:

        ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION

        我应该补充一点,对于有效的Excel文件,程序包运行正常,提交事务(任务#4)完成且没有错误。 知道什么可能导致事务回滚抛出错误?

1 个答案:

答案 0 :(得分:0)

我能够通过将故障优先约束从DFT更改为回滚EST从逻辑AND到逻辑OR 来解决此问题。