没有MSDTC的情况下如何回滚事务SSIS?

时间:2018-11-01 18:43:44

标签: sql-server visual-studio-2017 sql-server-data-tools ssms-2017 ssis-2017

1st。)

我有一个Sequence容器。 它具有4个不同的执行SQL任务和4个不同的DFT,其中数据插入到不同的表中。 我想在包失败时实现带有或不带有MSDTC服务的事务,即每个数据都应在任何DFT失败时回滚或执行SQL任务。 如何执行呢?当我尝试使用MSDTC服务实现时,出现“ OLEDB连接”错误,并且在没有MSDTC的情况下,仅插入了最后执行的Sql任务,没有插入数据。如何在SSIS 2017上实现这一点?

第二。

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

第三。

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

先谢谢了!! ;-)

2 个答案:

答案 0 :(得分:0)

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

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

效果很好,很容易实现。

答案 1 :(得分:0)

根据我的方案: 我使用了一个序列容器(其中包含不同的DFT和任务),并接受了3个以上的Execute sql任务:

第一个开始事务T1(在序列容器之前)

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

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

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

*重要信息:***要使上述操作生效,请确保在连接管理器属性中** RetainSameConnection 默认设置为True,它为false。

现在,要使用用户处理程序将错误记录到用户定义的表中,因此场景是当序列容器发生故障时,所有内容都会回滚,包括事件处理程序中执行sql任务中使用的表。那么解决方案是什么?

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

注意::我们正在使用序列容器并行执行任务。该错误发生在任何任务的序列容器内部,并且任务不允许序列容器失败。在那种情况下,请串行连接所有任务。是的,这对序列容器毫无意义。我发现我的解决方案可以工作这样。

希望对所有人有帮助! ;-)