我在SSIS作业中有一个条件分割,它根据CDC操作插入或更新。删除实际上没有删除,只是标记删除的行(所以它也是一个更新语句)。
这就是它的样子:
与红色x相关联的错误消息是
“事务(进程ID 67)在锁定资源上与另一个进程发生死锁,并被选为死锁牺牲品。重新运行该事务。”。
我尝试在其中添加一个额外的输入箭头,因此它一次只运行一次更新,但它不会让我。
答案 0 :(得分:0)
我怀疑FactWaybillTrans在目的地检查了表锁。这通常是您在加载大量数据时所需要的。但是,既然你也想要更新同样的东西,那就会与锁冲突,从而导致死锁。即使没有检查表锁,默认锁也可以升级为完全锁定。
我希望将更新分段到表(stage.CDCWaybillUpdates
),然后在数据流之后触发执行SQL任务。更清洁,没有陷入僵局的机会。
你可以伪造它但它完全不可靠。在NumRowsUpdated和Update之间添加排序操作。这可能会导致足够的拖动,以便OLE DB目标在更新开始触发之前完成并释放其锁定。如果它没有足够慢,那么在相反的方向排序相同的数据。可怕的,黑客的做法,但有时你必须做愚蠢。