2017-08-24 76 views
0

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

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

  1. 脚本任务利用的是C#FileSystemWatcher的看一个Excel文件下降到Drop文件夹。

  2. 与下面的语句执行SQL任务

BEGIN TRANSACTION TRAN1;

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

  • 在上述的成功优先约束,一个与下面的语句执行SQL任务

  • 提交事务TRAN1;

  • 论的上述第3项的故障优先约束,一个与以下语句执行SQL任务
  • 回滚事务TRAN1;

    请注意,由于MSDTC未在数据库服务器中启用,因此我无法使用基于默认DTC的事务。因此使用本地SQL事务。另外,我在所有数据库相关任务中使用了一个OLEDB连接管理器(这是一个远程Sql Server数据库,因此使用了OLE DB)。 Oledb连接管理器的RetainSameConnection属性设置为True。此外,所有与数据库相关的任务都将其事务选项设置为支持。 然而,与具有无效数据的一个输入Excel文件运行程序包,为回滚任务#5抛出以下错误,并且在同一记录到错误日志表:

    回滚事务请求有没有相应的BEGIN TRANSACTION

    我应该补充一点,对于一个有效的Excel文件,该包可以在Commit Transaction(任务4)正常完成的情况下正常运行。 任何想法可能导致事务回滚抛出错误?

    +0

    我怀疑这个交易在SSIS中是这样工作的。开始事务范围是一项任务,要么试图以不同的方式提交/回滚。 – Rex

    +0

    这就是连接管理器的RetainSameConnection属性设置为true并且所有任务使用相同的连接管理器的原因。 – fuzzygeek

    +0

    此外,我最初创建了没有for循环容器的包,并且没有用于DFT的OnError错误处理程序,并且当时提交事务和回滚事务任务都成功运行。因此,只要RetainSameConnection为true,就可以在一个任务中开始事务并在另一个任务中提交/回滚。 – fuzzygeek

    回答

    0

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