数据流插入锁



我的数据流任务锁定有问题,此任务比较来自同一服务器的几个表,并将结果插入到正在比较的表之一中。正在通过 NOT EXISTS 子句比较要插入的表。

执行快速加载时,任务冻结且没有错误,执行常规插入时,任务会给出死锁错误。

我还有其他 2 个任务对同一个表执行相同的操作,它们工作正常,但插入的信息量要小得多。我没有并行运行这些任务。

我正在考虑使用无锁提示来解决这个问题,因为这是写入 cerain 表分区的唯一任务,但是我得出这个结论只是因为我无法弄清楚其他任何事情,除了使用临时表或散列反连接。

可能你有所谓的死锁情况。数据流任务 (DFT) 中有两个指向同一表的单独连接实例。第一个 conn 实例运行SELECT并将共享锁放在表上,第二个实例运行INSERT并放置页或表锁。
关于可能的原因说几句话。SSIS DFT 读取表行并批量处理它。当行数较少时,读取将在单个批处理中完成,并且在执行插入时消除共享锁定。当行数很大时,SSIS 会将行拆分为多个批次,并按顺序进行处理。这允许在数据源完成读取之前执行DFT数据源之后的步骤。
设计 - 在同一数据流中读取和写入同一表不好,因为可能存在锁定问题。解决方法:

  • 将所有 DFT 逻辑移到单个 INSERT 语句中并摆脱 DFT。可能是不可能的。
  • 拆分 DFT,将数据移动到中间表中,然后 - 使用以下 DFT 或 SQL 命令移动到目标表。需要其他表。
  • 在数据库上设置已提交读取快照隔离 (RCSI),并在 SELECT 上使用已提交读取。仅适用于 MS SQL DB。

最通用的方式是第二种带有附加表的方法。第三个仅适用于MS SQL。

相关内容

最新更新