【发布时间】:2017-11-16 22:55:45
【问题描述】:
我在基于 CDC 操作插入或更新的 SSIS 作业中有条件拆分。删除实际上并不删除,它们只是标记已删除的行(因此它也是一个更新语句)。
这就是它的样子:
而与红色x相关的错误信息是
“事务(进程 ID 67)在锁资源上与另一个进程死锁,并已被选为死锁牺牲品。重新运行事务。”。
我尝试在其中添加一个额外的输入箭头,因此它一次只运行一个更新,但它不会让我这样做。
【问题讨论】:
-
我怀疑 FactWaybillTrans 在目的地检查了表锁。这通常是您在加载大量数据时想要的。但是,由于您还想更新相同的内容,这将与锁发生冲突,因此会出现死锁。即使不检查表锁,默认锁也可能升级为全锁。
-
我希望将我的更新暂存到一个表 (
stage.CDCWaybillUpdates),然后在数据流之后触发一个执行 SQL 任务。更干净,没有死锁的机会 -
您可能能够伪造它,但它完全不可靠。在 NumRowsUpdated 和 Update 之间添加排序操作。这可能会引起足够的阻力,以便 OLE DB 目标在更新开始触发之前完成并释放其锁定。如果它的速度不够慢,则将相同的数据按相反的方向排序。可怕的,骇人听闻的方法,但有时你不得不做傻事
-
您也可以插入一个只执行 Thread.Sleep(x) 的脚本任务 - 也是 hackish,但它让您更明显地知道您遇到了时间问题。
-
实际上,尝试在 Update 分支中从 'Mark deleted Facts' 到 'Num Rows Updated' 的依赖项(绿线)。这可能会让它等待删除结束。
标签: sql-server ssis