2017-01-04 178 views
0

我的预定作业每天工作6次。 有时候它的失败原因是死锁。我试图找出谁阻塞我的会议。SQL Server死锁

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

当失败所示作业错误消息belown,

交易(进程id)被死锁的锁资源与另一个过程和已被选作死锁牺牲品。重新运行交易。

回答

0

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

如果你想减少你的进程死锁这里的风险是一些战略...

  • 尝试插入/ UPDATE/DELETE表以相同的顺序。例如。如果一个进程是这样​​做的:

    BEGIN TRAN; UPDATE TableA; UPDATE TableB; COMMIT; 
    

,而另一个过程是这样做的:

BEGIN TRAN; UPDATE TableB; UPDATE TableA; COMMIT; 

存在一种风险,即一个进程将死锁等。完成时间越长,死锁的风险就越高。 SQL Server将随机选择一个进程作为“死锁受害者”。

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

感谢您的解释尼克。祝你有美好的一天。 – Oracsql

+0

不客气! –