我有一个非常复杂的场景,可以并行运行相同的包。在某些情况下,执行都可能最终尝试将同一行插入目标,这会导致违反主键错误。
目前有一个查询检查目标表以查看记录是否存在,因此插入是在其“无匹配”输出上完成的。它不会阻止错误,因为查找是在程序包启动时加载的,因此两个程序包都会在其上获取相同的数据,如果两行中都有一行,则会将其视为“新”行,因此第一行成功,第二行失败
可以采取哪些措施来避免这种情况?几乎忽略了oledb目的地的“重复行”?我无法使用MAX ERROR COUNT,因为重复的行位于第一个包中不存在的其他行中,并且应插入。
答案 0 :(得分:2)
默认查找行为是采用完全缓存模式。正如您所观察到的,在程序包验证阶段,它会将所有查找值拉入本地内存缓存并使用导致它缺少对表的更新。
对于您的方案,我会尝试将缓存模式更改为None
(部分是另一种选择)。 None表示对于每个通过的行,应该向目标数据库触发实际查询。根据您的数据量或性能不佳的查询,这可能会对目标产生无意义的影响。它仍然不能保证并行实例不会尝试加载完全相同的记录(或者并行运行已经满足了它们的查找并准备写入目标表)但它应该改进情况。
如果您无法控制包执行以便并发数据流被触发,那么您应该考虑重新设计该方法(写入分区并交换,使用某些东西来锁定资源,暂存所有数据并使用TSQL合并等)
答案 1 :(得分:0)
只是一个想法......如何将新记录写入临时表并间歇地合并?这将有机会过滤掉重复的内容。