0

第一个。)

我有一个序列容器。它有 4 个不同的执行 sql 任务和 4 个不同的 DFT,其中数据插入到不同的表中。我想在包失败时使用或不使用 MSDTC 服务来实现事务,即,每个数据都应该在任何 DFT 失败或执行 SQL 任务时回滚。如何实施?当我尝试使用 MSDTC 服务实现时,我收到“OLEDB 连接”错误,并且没有 MSDTC 数据被插入,只有最后一个执行 Sql 任务被回滚。如何在 ssis 2017 上实现这一点?

第 2 次。)

当我通过将 ServerConnection RetainSameConnection的属性设置为 TRUE 来尝试不使用 MSDTC 并为开始事务和提交执行了另外两个执行 sql 任务时。我遇到了事件处理程序的问题,即我无法将错误记录到不同的表中。尝试操作时,回滚正在工作或事件处理程序。一旦发生错误,控件就会转到事件处理程序,然后回滚所有事情,包括事件处理程序中的任务

第三)

序列容器用于并行执行任务。因此,这 4 个任务中的特定任务失败了,只有那个特定任务回滚休息 SQL 任务是将数据插入表中。

提前致谢!!;-)

4

2 回答 2

0

根据我的场景:我使用了一个序列容器(其中包含不同的 DFT 和任务),并且还执行了 3 个执行 sql 任务:

1st Begin Transaction T1(在序列容器之前)

第二次提交事务 T1(在序列容器之后)

第三个回滚事务T1(在序列容器之后),优先级为失败,即只有当序列容器失败时,才会执行包含回滚操作的Execute Sql任务。

注意:我尝试以这种方式回滚,但仅插入了当前执行的 sql 任务,即最接近它的正在回滚的其余数据被插入。那么解决方案是什么?在同一个执行 sql 任务中,我截断了插入行的表。因此,当序列容器失败时,执行 sql 任务将截断相应表中的所有数据。(回滚事务 T1 去截断表 Table_name1 去截断表 table_name2 去截断表 table_name3)

*重要提示:***要使上述操作正常工作,请确保在连接管理器属性中 **RetainSameConnection默认设置为 True,它是 false。

现在,为了将错误记录到用户定义的表中,我们使用事件处理程序。所以场景是,当序列容器失败时,所有内容都会回滚,包括事件处理程序中执行 sql 任务中使用的表。那么解决方案是什么?

当您不使用 SSIS 事务属性时,默认情况下每个任务都将属性设置为支持。事件处理程序中的 Execute sql 任务也具有与Supported相同的属性,因此它遵循相同的事务。要使事件处理程序正常工作,请更改 Execute Sql 任务的连接,即采用不同的连接并将其TransactionProperty设置为NotSupported。因此,它不会遵循相同的事务,并且当发生任何错误时,它会将错误记录到表中。

注意:我们使用序列容器并行执行任务。如果?错误发生在任何任务的序列容器内,并且任务不允许序列容器失败。在这种情况下,串行连接所有任务。是的,这对序列容器没有意义。我找到了我的解决方案那样。

希望对大家有帮助!;-)

于 2018-11-05T05:40:08.250 回答
0

我使用的一个选项(没有 MSDTC)是将您的 OLEDB 连接配置为 RetainSameConnection=True (通过属性窗口)

然后在您的序列容器之前开始一个事务并在之后提交(全部共享相同的 OLEDB 连接。

工作得很好并且很容易实现。

于 2018-11-01T18:52:03.587 回答