0

我有一个相当复杂的场景,可以并行运行相同的包。在某些情况下,两个执行都可能最终尝试将同一行插入到目标中,这会导致违反主键错误。

当前有一个查找检查目标表以查看记录是否存在,因此插入在其“不匹配”输出上完成。它不会阻止错误,因为查找是在包启动时加载的,因此两个包都在其上获得相同的数据,如果有一行出现,它们都会将其视为“新”行,因此第一个成功,第二个失败.

有什么办法可以避免这种情况?几乎忽略了 oledb 目标上的“重复行”?我不能使用 MAX ERROR COUNT,因为重复行位于不在第一个包上的其他行中,应该插入。

4

2 回答 2

2

默认查找行为是使用完整缓存模式。正如您所观察到的,在包验证阶段,它会将所有查找值拉入本地内存缓存并使用导致它丢失对表的更新的值。

对于您的情况,我会尝试将缓存模式更改为None(部分是另一个选项)。None 表示应该针对通过的每一行向目标数据库发起实际查询。根据您的数据量或性能不佳的查询,这可能会对目标产生不小的影响。它仍然不能保证并行实例没有尝试加载完全相同的记录(或者并行运行已经满足了它们的查找并准备写入目标表),但它应该会改善这种情况。

如果您无法控制包执行以使并发数据流被触发,那么您应该考虑重新构建该方法(写入分区并换入,使用某些东西来锁定资源,暂存所有数据并使用 TSQL 合并等)

于 2013-01-16T13:53:07.780 回答
0

只是一个想法......如何将新记录写入临时表并间歇性地合并它?这将有机会过滤掉重复项。

于 2013-01-16T18:59:15.953 回答