【问题标题】:SSIS Conditional split results in deadlock errorSSIS 条件拆分导致死锁错误
【发布时间】: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


【解决方案1】:

我怀疑 FactWaybillTrans 在目的地检查了表锁。这通常是您在加载大量数据时想要的。但是,由于您还想更新相同的内容,这将与锁发生冲突,因此您会遇到死锁。即使不检查表锁,默认锁也可能升级为全锁。

我希望将我的更新暂存到一个表 (stage.CDCWaybillUpdates),然后在数据流之后触发一个执行 SQL 任务。更干净,没有死锁的机会。

您也许可以伪造它,但它完全不可靠。在 NumRowsUpdated 和 Update 之间添加排序操作。这可能会引起足够的阻力,以便 OLE DB 目标在更新开始触发之前完成并释放其锁定。如果它的速度不够慢,则将相同的数据按相反的方向排序。可怕的,骇人听闻的方法,但有时你不得不做傻事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2018-04-20
    • 2012-09-20
    • 2018-06-04
    相关资源
    最近更新 更多