Deadlock Happen如何在Same Table插入和更新时解决

时间:2017-12-05 19:53:48

标签: sql-server ssis

我有一个SSIS包,其中包含一个加载数据的任务。出于某种原因,我需要更新并插入相同的目标表。这发生了死锁

我使用SSIS MULTI-CAST控件。

enter image description here 该怎么办?如何解决这种情况?

2 个答案:

答案 0 :(得分:0)

在您的OLE DB目标中,从" FastLoad"更改访问模式。到"表或视图"。前者将采用表锁,通常更适用于大型插件,但在您的场景中,您需要将表保持为“解锁”。"由于您将发布单例插入,因此您的性能将受到影响但我认为这并不重要,因为您还将使用" OLE DB命令进行单例更新"

最后,我认为你做错了。多播基本上复制了一行,以便您可以将其定向到N个组件。我通常会看到人们试图检测目标中是否存在行,然后根据该查找插入或更新它。但这是查找组件,而不是多播。也许你正在做一个2型或者其他什么,但即使这样,也会有更好的方法来实现这一点,而不是你在图片中显示的内容。

答案 1 :(得分:0)

你的方式似乎很奇怪,正如 billinkc 所说,你实际上是双数据行,并且从两个不同的连接/上下文同时对同一个表执行INSERT和UPDATE操作。这必须以僵局告终。

我会使用替代方法 - 对数据进行必要的转换,然后将其写入DataFlow中的中间表。然后在下一个SSIS任务 - 执行MS SQL MERGE - Microsoft表upsert - 使用OLE DB命令。这将确保您在并发操作之间没有死锁,MERGE的逻辑可能非常灵活。

最后但并非最不重要 - 使用专用或全局 ## temp 表作为中间表,在SSIS中使用常规MS SQL #temp 表有点棘手。不要忘记在MERGE之前和之后清理中间件,或者正确地创建和处理## temp表。