0

我在 SSIS 中有一个包含多个任务的包。我正在加载文件,如果最后的文件系统任务失败,我希望能够回滚事务。我的包看起来像那样。general_package 我希望能够回滚 SSIS 脚本已完成的所有操作。为此,我需要 SSIS 脚本加入由 BEGIN_TRANSACTION Sql 任务创建的事务。我该怎么做?

在 ssis 收集交易我做:

 object rawConnection = Dts.Connections["destination_ado"].AcquireConnection(Dts.Transaction);
             myADONETConnection = (SqlConnection)rawConnection;

然后我做一个 BulkCopy:

using (SqlBulkCopy sbc = new SqlBulkCopy(myADONETConnection))
                    {
                        sbc.DestinationTableName = "[" + SCHEMA_DESTINATION + "].[" + TABLE_DESTINATION + "]";
                        //  sbc.DestinationTableName = "test_load";
                        // Number of records to be processed in one go
                        sbc.BatchSize = 10000;


                        // Finally write to server
                        sbc.WriteToServer(destination);
                    }
                    myADONETConnection.Close();

如何告诉 SqlBulkCopy 使用现有事务?在 SSIS 的连接选项中,我使用 RetainSameConnection:true

谢谢你的所有想法

文森特

4

2 回答 2

0

所以我找到了解决方案。在第一个脚本块(提取和加载)上,我使用以下代码创建了一个事务:

SqlTransaction tran = myADONETConnection.BeginTransaction(IsolationLevel.ReadCommitted);

然后我以这种方式在 SqlBulkCopy 中使用此事务:

using (SqlBulkCopy sbc = new SqlBulkCopy(myADONETConnection,SqlBulkCopyOptions.Default,tran))

将事务对象传递给 SSIS 变量:

Dts.Variables["User::transaction_object"].Value = tran;

然后在最后提交事务和回滚事务的两个块上,我使用 SSIS 脚本,读取变量并提交或回滚事务:

SqlTransaction tran = (SqlTransaction)Dts.Variables["User::transaction_object"].Value;
tran.Commit();

结果,如果一个文件不能移动到存档文件夹,我不会加载两次,每个文件都会触发一个事务,所以如果一个文件不能更多,只有关于这个文件的数据会回滚并且枚举器继续去下一个。

于 2016-11-18T00:30:51.510 回答
0

查看您的包,我看到您正在迭代一堆文件,并且对于每次迭代,您都将文件内容加载到目标表中。您希望所有数据加载都是原子的,即完全加载或根本没有加载。

考虑到这一点,我想建议以下方法,在所有这些方法中,不需要明确使用脚本任务或开始/结束事务块 -

  1. 使用数据流任务并在属性中将 TransactionOption 设置为必需。这将完成在区块上启用交易的工作
  2. 在目的地以批量方式将错误重定向到错误表,以便将错误最小化到尽可能低的最小值(例如 - http://agilebi.com/jwelch/2008/09/05/error -redirection-with-the-ole-db-destination/)。当每天加载超过百万的数据时,我们成功地使用了 100k、50k、1 作为 3 个批次。然后,您可以单独处理这些错误。
  3. 如果用例是整个数据必须失败,那么只需重定向失败的记录。使用文件系统任务 (FST) 将记录移动到“失败”文件夹。在 FST 之后有一个 DFT 以在目标上执行查找,然后删除所有这些记录。
于 2016-11-14T07:32:14.170 回答