SSIS中的显式交易声明会导致双重'回滚异常

时间:2016-06-23 12:32:53

标签: ssis transactions msdtc

使用SSIS,这是我的控制流程

SSIS Coontrol Flow

但是这里有一个问题: 当序列容器中发生异常并且流程进入故障路由时,我在回滚事务上收到错误,告诉我该事务已经回滚。

以下是关键信息:

  • 我在我的两个Connection Manager上使用RetainSameConnection = True(由不同的数据流使用)。它不是分布式事务,其中一个连接纯粹是为了读取目的。
  • 我有一个事件处理程序,在Sequence Container上传播为false。
  • 所有交易选项均设为'支持'。
  • 我的事务是显式声明的(Begin,Commit和Rollback)。

好像我的事务被注册到分布式事务(DTC)并被序列容器回滚,所以当我尝试自己回滚它时,它会生成第二个异常,导致整个包失败。

我无法在本地机器上重现问题,只能在prod环境中重现。 任何人都不知道吗?

1 个答案:

答案 0 :(得分:0)

这个问题的部分答案/解决方案是:

  • 事务在SQL类型例外(例如:重复键等)事件上自动回滚,事件很难被声明。因此,只有在发生其他异常时才会使用流的回滚部分。

我们如何管理这种行为?

  • 我们必须使用一些特定于数据库的命令(在我的情况下是SQLServer)来验证我们是否仍然在回滚之前处于事务中,否则我们将得到一个异常,试图回滚一个不存在的事务。

以下是我案例中的代码:

    IF @@TRANCOUNT > 0               
         Rollback Transaction TX_NAME;

希望有一天能帮到某人; - )