【问题标题】:Resolving deadlock - SQL Server解决死锁 - SQL Server
【发布时间】:2019-07-11 22:55:10
【问题描述】:

我在来自 2 个单独的存储过程的这 2 个查询之间遇到了死锁:

1.

UPDATE ord
SET
    [Num] = @Num,
    [Ref] = @Re,
    [Date] = @Date
FROM [Order] ord
INNER JOIN [Orders_Open] oo ON oo.Id = ord.ID

2.

    UPDATE oo
    SET oo.Name = i.Name,
    oo.Email = i.Email,
    oo.PostCode = i.PostCode,
    FROM Item_Order i 
    INNER JOIN [Orders_Open] oo ON oo.ID = i.ID

防止发生死锁的最佳方法是什么?我已经研究过在死锁发生之前使用 holdlock 来防止死锁:

例如

    UPDATE oo WITH (HOLDLOCK)
    SET oo.Name = i.Name,
    oo.Email = i.Email,
    oo.PostCode = i.PostCode,
    FROM Item_Order i 
    INNER JOIN [Orders_Open] oo ON oo.ID = i.ID

这行得通吗?或者其他人可以就我可以尝试的其他方法提供建议吗?

谢谢

【问题讨论】:

  • 你之前在每个SP中是否对同一个事务进行过操作?
  • 超过 1 个更新同时触发,命中同一来源?
  • @EzLo 不,只是一个选择语句。交易也是隐含的。它会通过明确表达来解决任何问题吗?
  • 我很确定问题是当 UPDATES 触发时,update 1 正在加入您的 oo 表中,该表也在更新中 - 您是否尝试过简单地向 UPDATE 1 脚本添加一个 nolock跟随 INNER JOIN [Orders_Open] oo WITH (NOLOCK) ?
  • @RyanGadsdon,如果您的意思是自动提交(每个语句都是单独事务的默认行为),我不希望显式事务产生不同。隐式事务在执行更新时启动事务,但不会自动提交事务。

标签: sql sql-server deadlock


【解决方案1】:

您不能同时更新同一记录,因为必须在每笔交易中保持数据完整性

数据完整性是指数据的准确性一致性 存储在数据库、数据仓库、数据集市或其他结构中。

您可以为两个查询使用一个事务块来防止死锁。

【讨论】:

    【解决方案2】:

    最好的方法是同时调整两者的性能,这样它们就不太可能同时运行。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多