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