该程序会创建挂起的锁和进程。使用 T-SQL 帮助终止进程。但是有一个问题,随之而来的是,完成了必要的流程,结果键入的数据没有保存(多次注意到)或者在另一个程序窗口中工作时,主窗体的流程结束了。
DECLARE @v_spid INT
DECLARE c_Users CURSOR
FAST_FORWARD FOR
SELECT SPID
FROM master..sysprocesses (NOLOCK)
WHERE spid>50
AND status='sleeping'
AND DATEDIFF(mi,last_batch,GETDATE())>=5
AND spid<>@@spid
OPEN c_Users
FETCH NEXT FROM c_Users INTO @v_spid
WHILE (@@FETCH_STATUS=0)
BEGIN
PRINT 'KILLing '+CONVERT(VARCHAR,@v_spid)+'...'
EXEC('KILL '+@v_spid)
FETCH NEXT FROM c_Users INTO @v_spid
END
CLOSE c_Users
DEALLOCATE c_Users
在没有找出原因的情况下杀死进程是不好的。而且,休眠意味着服务器正在等待来自客户端的请求,在这种情况下,可以限定处于完全不同逻辑状态的会话。
会话可能有一个打开的事务,它可能在各个命令之间处于休眠状态,或者它可能没有打开的事务 - 例如,客户端刚刚连接到服务器,或者客户端连接并发出请求,但连接没有关闭(很快就会再次需要它)。
你最好调查一下情况。有时sp_who、sp_who2和sp_lock就足够了。
进程挂起请求的主要原因通常是:
寻找发出长请求的会话
如果会话被某人阻止,那么您将在 中看到会话 ID
blocking_session_id。然后,对于特定会话,您可以看到其中发生了什么,一直到当前执行命令的文本和计划:
您可以搜索交易不完整的会话,例如,如下所示: