SSIS 中的显式事务声明导致 'double' 回滚异常
Explicit transaction declaration in SSIS causes 'double' rollback exception
使用 SSIS,这是我的控制流程
但问题是:
当序列容器中发生异常并且流程转到失败路由时,我在回滚事务上收到错误消息,告诉我事务已经回滚。
以下是关键信息:
- 我在我的两个连接管理器(由不同的数据流使用)上都使用 RetainSameConnection=True。这不是分布式事务,其中一个连接纯粹是为了读取目的。
- 我有一个事件处理程序,在序列容器上设置了 propagate to false。
- 所有交易选项都设置为 'Supported'。
- 我的事务已明确声明(开始、提交和回滚)。
似乎我的事务被注册到分布式事务 (DTC) 中并被序列容器回滚,所以当我尝试自己回滚时,它生成了第二个异常,导致整个包失败。
我无法在我的本地计算机上重现该问题,只能在生产环境中重现。
有人知道吗?
这个问题的部分 answer/solution 是:
- 交易会在 SQL 类型异常(例如:重复键等)事件发生时自动回滚。因此,流程的回滚部分仅在发生其他异常时使用。
我们如何管理此类行为?
- 我们必须使用一些特定于数据库的命令(在我的例子中是 SQLServer)在回滚之前验证我们是否仍在事务中,否则我们会得到一个异常,试图回滚一个不存在的交易。
这是我的代码:
IF @@TRANCOUNT > 0
Rollback Transaction TX_NAME;
希望有一天能对某人有所帮助 ;-)
使用 SSIS,这是我的控制流程
但问题是: 当序列容器中发生异常并且流程转到失败路由时,我在回滚事务上收到错误消息,告诉我事务已经回滚。
以下是关键信息:
- 我在我的两个连接管理器(由不同的数据流使用)上都使用 RetainSameConnection=True。这不是分布式事务,其中一个连接纯粹是为了读取目的。
- 我有一个事件处理程序,在序列容器上设置了 propagate to false。
- 所有交易选项都设置为 'Supported'。
- 我的事务已明确声明(开始、提交和回滚)。
似乎我的事务被注册到分布式事务 (DTC) 中并被序列容器回滚,所以当我尝试自己回滚时,它生成了第二个异常,导致整个包失败。
我无法在我的本地计算机上重现该问题,只能在生产环境中重现。 有人知道吗?
这个问题的部分 answer/solution 是:
- 交易会在 SQL 类型异常(例如:重复键等)事件发生时自动回滚。因此,流程的回滚部分仅在发生其他异常时使用。
我们如何管理此类行为?
- 我们必须使用一些特定于数据库的命令(在我的例子中是 SQLServer)在回滚之前验证我们是否仍在事务中,否则我们会得到一个异常,试图回滚一个不存在的交易。
这是我的代码:
IF @@TRANCOUNT > 0
Rollback Transaction TX_NAME;
希望有一天能对某人有所帮助 ;-)