我的预定工作是一天工作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代码行更少
- 如果可能,处理较小批次的数据。如果您正在处理大量的行,请尝试添加批处理,以便代码在任何给定时间锁定较小的数据批