目前我遇到很多服务器进程问题(从sp_who2看到)正在“休眠”而不仅仅是,完成(被删除),当我连接到我的MSSQL数据库时,调用存储过程,获取一些数据然后关闭连接。
C#/ .NET连接到MSSQL数据库,调用存储过程,从存储过程(数据读取器)检索数据然后关闭连接的最佳方法是什么?
是否有办法关闭/处置“睡眠”进程被杀死?
是否与我创建新的SqlConnections,打开它们并一直关闭它们有关?
我的流程如下:
发出请求:
.Close();
我很抱歉如果这个问题缺少一些细节,但我希望这足以得到一些有用的答案。
谢谢!
答案 0 :(得分:0)
您需要使用SET XACT_ABORT ON或添加一些客户端回滚代码
当发生客户端超时事件(例如.net CommandTimeout)时,客户端向SQL Server发送“ABORT”。然后SQL Server简单地放弃查询处理。没有回滚任何事务,也没有释放锁。
现在,连接将返回到连接池,因此SQL Server上的连接未关闭。如果发生这种情况(通过KILL或客户端重启等),那么将清除事务+锁。请注意,sp_reset_connection不会清除它们,也不会清除它们,即使它是为了这样做而公布的
来自中止的碎屑会阻挡其他过程。
在客户端超时(严格地说,ABORT事件)上使SQL Server清除事务+锁定的方法是使用SET XACT_ABORT ON。
您可以在SSMS中验证这是打开2个查询窗口:
窗口1:
在菜单Query..Query Options中设置超时5秒然后运行此
BEGIN TRAN
UPDATE sometable WITH (TABLOCKX) SET foo = foo WHERE 1 = 0;
WAITFOR DELAY '00:00:10' -- just has to be longer then timeout
窗口2,这将永远等待(或达到你的超时)
SELECT * FROM sometable