2017-06-21 52 views
1

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

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

我有2个其他任务对同一个表执行相同的操作,它们工作正常,但插入的信息量更小。我不是在平行运行这些任务。

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

回答

3

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

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

最普遍的方法是第二个附加表。第三个仅适用于MS SQL。