我在SSIS中有一个包含多个任务的包。我正在加载文件,如果文件系统任务最终失败,我希望能够回滚事务。我的包看起来像那样。 我希望能够回滚SSIS脚本已完成的所有操作。为此,我需要SSIS脚本在BEGIN_TRANSACTION Sql任务创建的事务中登记。我怎么能这样做?
在收集交易的过程中我做了:
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
感谢您的所有想法
文森特
答案 0 :(得分:0)
查看您的软件包,我发现您正在迭代一堆文件,并且每次迭代都会将文件内容加载到目标表中。 您希望所有数据加载都是原子的,即完全加载或根本不加载。
考虑到这一点,我想建议以下方法,在所有这些appraoches中,不需要明确使用Script Task或Begin / End Transaction块 -
答案 1 :(得分: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;
然后在我的两个块结尾提交事务和Rolloback事务我使用SSIS脚本,读取变量并提交或回滚事务:
SqlTransaction tran = (SqlTransaction)Dts.Variables["User::transaction_object"].Value;
tran.Commit();
因此,如果文件无法移动到Archive文件夹,我没有加载两次,则每个文件都会触发一个事务,所以如果一个文件不能再多,那么这个文件的数据就会得到回滚和调查员继续前往下一个。