SQL Server Deadlock



我的预定工作是一天工作6次。有时它的失败会导致死锁。我试图确定是谁阻止了我的会话。

我搜索了一下,发现了sql探查器,但并没有显示确切的结果。如何用T-SQL或任何其他方式识别历史?

当下面显示失败作业错误消息时,

事务(进程id)与另一个进程在锁资源上死锁,已被选为死锁牺牲品。重新运行事务。

这将有助于识别死锁受害者或死锁的原因:https://ask.sqlservercentral.com/questions/5982/how-can-i-identify-all-processes-involved-in-a-dea.html

如果你想降低进程死锁的风险,这里有一些策略。。。

  • 尝试以相同的顺序插入/更新/删除表。例如,如果一个进程正在执行此操作:

    BEGIN TRAN; UPDATE TableA; UPDATE TableB; COMMIT;
    

而另一个进程正在执行此操作:

BEGIN TRAN; UPDATE TableB; UPDATE TableA; COMMIT;

存在一个进程将使另一个进程陷入僵局的风险。完成的时间越长,出现死锁的风险就越高。SQL Server只需随机选择一个进程作为"死锁受害者"。

  • 尽量减少事务中涉及的代码。即,BEGIN TRANSACTION和COMMIT TRANSACTION语句之间的INSERT/UPDATE/DELETE代码行更少
  • 如果可能,处理较小批次的数据。如果您正在处理大量的行,请尝试添加批处理,以便代码在任何给定时间锁定较小的数据批

最新更新