数据流插入锁定

时间:2017-06-21 23:50:00

标签: sql ssis

我的数据流任务锁定存在问题,此任务会比较来自同一服务器的几个表,并将结果插入到正在比较的其中一个表中。正在插入的表由NOT EXISTS子句进行比较。

执行快速加载时,任务会在执行常规插入时冻结而不会出现错误,从而导致死锁错误。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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