【问题标题】:Transaction (Process ID 72) was deadlocked事务(进程 ID 72)已死锁
【发布时间】:2016-03-18 20:07:22
【问题描述】:

我们使用条件拆分来拆分为两个,基于从源到两个目标的条件(两者都是同一张表)。它以前运行良好,但现在我们在这项任务中面临死锁问题。错误如下:

SSIS 错误代码 DTS_E_OLEDBERROR。发生 OLE DB 错误。错误 代码:0x80004005。 OLE DB 记录可用。资料来源:“微软 SQL Server Native Client 10.0" Hresult: 0x80004005 描述: “事务(进程 ID 72)在锁定资源上死锁 另一个进程并已被选为死锁受害者。重新运行 交易

我们已将 OLEDB 目标编辑器的属性设置为 TABLE LOCK,最大插入提交大小为 1000000

我是 SSIS 新手,请帮我解决这个问题!

这是数据流任务的快照

【问题讨论】:

  • 死锁图说的相关进程是什么?除了您的 SSIS 包之外,可能还有其他参与者...
  • 请帮助激活死锁图。我不知道
  • 如果您至少在 2008 年,您可以从默认的 SQL Server 扩展事件会话中获取死锁图(只要您在引发死锁后合理地尽快检查它)
  • 你不需要激活它,你只需要监控它。除了 Martin Smith 所说的 re:extended events,您可以在 SQL Profiler 中查看。使用死锁图事件创建一个会话,然后启动您的进程。

标签: sql-server ssis


【解决方案1】:

我建议删除其中一个目标组件(这样您就不会为同一张表提供 2 个目标组件)。以下是一些关于如何做到这一点的建议:

  • 添加一个 Union All 并让Less_than_1 输出和Less_than_2 输出转到它。然后将 Union All 输出转到目标表
  • 分析条件拆分中的条件,看看是否可以将它们合并为一个(例如ColumnValue is less than 1 OR ColumnValue is less than 2)。我只是建议这样做,因为数据将进入同一个表。
  • 将现有数据流拆分为 2 个单独的数据流(每个条件一个)

在不知道您的条件拆分背后的具体逻辑的情况下,我想不出任何其他方法。

【讨论】:

  • 拆分是为了使加载性能更好...只是根据行 ID 拆分奇数行和偶数行...我怀疑目标中的锁定选项是否出现在这里关于这个问题...
  • 我很好奇,拆分是如何提高负载性能的?
  • 行被分成两行并并行加载,例如 50000 条记录被并行加载为 250000,这使得加载到同一个表中的速度更快。请检查此链接...henkvandervalk.com/…
  • 哇,非常有趣的文章和结果 (+1)!我在大约 400 万条记录上测试了这种方法,结果非常好。不过我要指出的是,文章指出数据已加载到 4 个单独的表中(请参阅文章中的 步骤 4)合并)。使用这种方法而不是单独的表加载到同一个表时,死锁的可能性可能要高得多。
  • 取消检查锁定条件是否可以使流程无死锁??我需要知道目标任务中的锁定检查。请指教
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多