我正在为其他用户排查以下错误。 另一个用户有一个非常简单的SSIS包。 他的包裹包含来源和目的地。
Source是一个不同的数据库。让我们说A 和目的地是一个不同的数据库。让我们说B
用户希望将数据从表SrcDBTabA复制到DstDBTabB
在他的SSIS中,他使用数据流任务。数据流任务的隔离级别设置为Serializable,TransactionOption是Supported。
OLE DB Source的数据流任务,他使用SQL Query从SrcDBTabA获取数据。他的查询是
SELECT SourceID,SourceName,SourceLastName FROM SrcDBTabA WHERE STATUS = 1
然后在OLE DB目标中,他将源输入列映射到他的表,并选中Table Lock和Check Contraints选项。 他的FastLoadKeepIndentity是假的 FastLoadKeepNulls为False FastLoadOptions是TabLock,Check_Constraints
程序包大部分时间运行良好,但有时会因错误而失败 违反主键。 “无法在具有唯一索引的对象中插入重复键行”
现在,这是源数据库表SrcDBTabA中发生的有趣事情。
此表每隔15分钟从另一个数据库获取数据,并在Source数据库中连续写入数据。我们在这个数据库中使用了大量的NOLOCKS查询,在从另一个数据库写入源数据库表SrcDBTabA时,我们确实使用了NOLOCKS。
源数据库表SrcDBTabA从不具有重复的键,ID列设置为主列并且是群集的。
IS Read Committed SnapShot ON的Source DB属性设置为FALSE。
我们认为可能发生此错误的一件事是由于污垢分类
我确实在网上看到了以下原因。链接为Same Data Read Twice
但是当我们在Select查询中没有使用NO Lock并且其隔离级别设置为Serialized
时,我无法理解SSIS中是如何读取重复的主键值的我无法对此做出回答,也无法在质量保证中重现此问题。
任何想法或推理