我的客户注意到有些连接已打开但从未关闭,因此 API 请求由于被“幽灵”进程阻止而超时。
客户表中的示例:
编号为 108 的进程阻塞了另一个进程。通过运行 SP_WHO2 我得到:
SPID STATUS LOGIN Hostname BLKBy DBNAME Command .... - PROGRAMNAME
108 - SLEEPING - Auser - . - . - DBNAme - AWAITING COMMAND ... (Nothing here).
被阻止的脚本很简单
Select Custid, name....
from Customer
Where custid = 1
我想过糟糕的索引,但那里有有用的索引。
我应该做什么来检查问题?我如何找到这些连接是如何创建而不是关闭的?
阻塞其他查询的休眠连接表示持有锁的会话上有未提交的事务。这可以通过以下方式观察到:
在没有最近活动的会话上长时间运行的事务表明应用程序代码中的连接/事务管理存在问题或不良的应用程序设计(例如,在事务期间等待用户操作)。作为最大化并发性的最佳实践,应用程序应在完成工作后立即提交/回滚事务。
在服务器端唯一可以做的就是终止会话,尽管您需要了解这样做的含义。在代码修复之前,问题可能会再次出现。