杀死数据库中的被阻止进程

时间:2009-03-15 22:36:58

标签: sql-server

如果我们在数据库中看到很多被阻止的进程,那么最佳解决方案是什么?

3 个答案:

答案 0 :(得分:3)

某些阻止是正常的,问题是阻塞是否导致问题导致查询无法及时完成或更糟糕导致死锁。您需要做的是确定导致阻塞的原因。微软有一些很好的工具来解决这个问题。

post应该是您的开始或here

答案 1 :(得分:2)

WITH(NOLOCK)不一定是个不错的选择。这将导致查询返回未提交的读取。在交易系统上,这可能是您不想要的行为。

答案 2 :(得分:-1)

临时解决方案

使用sp_who查找spid并杀死spid(即kill 59,其中59是阻塞进程的spid)以终止进程。

真正的解决方案

这会对问题进行排序,但不会再阻止它再次发生。要做到这一点,你需要查看你的代码。我建议您至少在任何选择中使用WITH NO LOCK以减少锁定的可能性。

此外,您可以重构您的代码,以便您只访问最少的次数。考虑复制到临时(#或##)表进行详细处理,然后根据需要复制回位置。这特别适用于准备报告数据的目的。最好将数据拉一次,然后远离主表进行任何其他处理。

如果由于基础数据变化太快或者您需要将更改应用于其他目的而无法实现,则使用SQL Service Broker排队异步工作项。这可以用于根据您的情况解决阻止问题。