SSIS OLEDB目标不使用快速加载和死锁

时间:2014-12-02 14:06:09

标签: sql-server ssis oledb deadlock

我通常不会在这里提问,除非我真的卡住了,在其他任何地方找不到答案。我的问题应该是相当简单的,并且如果已经在其他地方得到回答而道歉,但我无法找到直接的答案。

我正在使用SSIS通过OLEDB Destination组件将数据插入表中。我只是使用“表或视图”的数据访问模式而不使用“快速加载”数据访问模式。我遇到了死锁问题,因为有4个SSIS包处理1条记录以插入到同一目标表中。必须将其设置为具有不同的SSIS包并一次处理1条记录,因为每条记录都是源系统中的单个事务。我已经读过,如果使用“快速加载”数据访问模式,有一个表锁定选项。如果我没有使用快速加载选项,这会自动锁定表格还是在不使用快速加载时没有表锁定?当其中两个SSIS包同时运行并且不知道OLEDB Destinations设置为不使用快速加载选项时,我试图找到死锁问题的根源,这可能是导致死锁的原因。我没有使用快速加载数据访问模式的原因是因为这个SSIS包一次运行1条记录,并且在使用快速加载时遇到触发器触发问题(我在使用快速加载时知道“FIRE_TRIGGERS”选项)

对我的问题的简单回答是我正在寻找的所有其他帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

表或视图模式不使用Tablock提示。您可以通过查看dmv sys.dm_tran_locks来查看执行包期间正在进行的锁定 插入操作将在表上进行某种程度的锁定 - 可能是页面上的IX和键上的X.

插入操作本身不会导致死锁,每个插入只会等待彼此,直到它们全部完成。另一方面,如果触发器在同一个表上占用额外的锁,但是等待另一个插入完成,则触发器可能会导致死锁。即。

  1. 插入1开始
  2. 插入2开始
  3. 触发器从插入1触发,正在等待插入2
  4. 触发器从插入2触发,正在等待插入1
  5. 所以看一下触发器在做什么。他们有一个很好的索引来执行他们的操作,还是他们正在进行扫描并升级锁? 您可以考虑禁用触发器,执行插入,然后作为后续步骤执行触发操作。 在任何情况下,要测试此理论,请禁用触发器并查看是否出现死锁。然后查看执行计划,看看是否可以使用更好的索引来改进它们。