SQL Server 中的阻塞
当与 SQL Server 的连接阻止一个或多个查询,并且与 SQL Server 的另一个连接要求查询上的锁类型冲突或查询被主连接锁定时,就会发生 SQL Server 中的阻塞。这会导致另一个连接等待主连接释放其锁定。一个连接可以阻止另一个连接,无论它们来自相同的应用程序还是来自不同客户端计算机上的不同应用程序。
几秒钟的阻塞是正常的,也是可以避免的。但是过多的阻塞可能会导致连接(应用程序或用户)长时间占用您的时间,在阻塞条件期间获取的最重要信息是阻塞 SPID(SQL 进程 ID)以及它在做什么。
收集阻塞信息:
下面的查询标识了阻塞链顶部的 SPID(SQL 进程 ID),因此是 SQL 语句 -
Select *
from sysprocesses
where blocked <> 0 ;
输出: spid、kpid、blocked、waittime、waittype、waitresource、lastwaittype、dbid、uid、cpu 等所有列都是空的。
在您确定阻塞 SPID 后,发出后续命令以敦促内容 -
dbcc inputbuffer (SPID)
要删除阻塞,请使用 KILL 命令。
KILL SPID_ofBlockingQuery
注意:一旦你杀死了一个进程,你就结束了它,这将导致不可预知的结果。对等效的 spid 多次使用 SQL KILL 命令会杀死正在重用此 spid 的较新处理。仅在一次使用 KILL 命令,除非您验证该方法未使用先前的 KILL 命令更改。
当阻止增加对系统性能有影响的目的时,通常是由于以下原因之一 -
- SPID 在释放一组资源之前会在很长一段时间内锁定一组资源。这种阻塞会随着时间的推移自行解决,但会导致性能下降。
- SPID 持有一组资源的锁并且从不释放它们。这种阻塞不会自行解决,并且会无限期地阻止对受影响资源的访问。
使用通过 SQL Server Management Studio 提供的功能来识别阻塞链的头部。
要尝试此操作,请使用以下步骤 -
选择服务器对象,展开Reports ,展开Standard Reports ,然后单击Activity – All Blocking Transactions 。
下面的报告显示了阻塞链顶部的交易(如果有的话)——
如果您展开交易,报告将显示被顶级交易阻止的交易。该报告还将显示“阻塞 SQL 语句”,因此也显示“阻塞 SQL 语句”。