2011-04-27 109 views
9

比方说,我有一个查询发送到我的SQL Server数据库,它需要超过30秒,我的程序引发SQL查询超时异常。查询是否仍然在我的数据库中徘徊,还是一旦抛出异常就会终止?如果超时,会发生什么情况?

回答

14

甲客户信号查询超时到 使用关注事件的服务器。 注意事件只是一个 不同类型的TDS数据包a服务器客户端可以发送给它的SQL 。在 除了连接/断开连接,T-SQL 批处理和RPC事件之外,客户端可以通过 注意到服务器。 注意告知服务器取消 连接当前正在执行的 查询(如果有的话)只要 可能。该注意不 回滚打开的事务,并且它 不会停止一毛钱当前执行的查询 - 服务器中止 不管它是做在下一可用 机会 连接。通常,这种情况发生得很快,但并非总是如此。

来源There's no such thing as a query timeout...

1

如果您收到SQL超时,则SQL停止,但是Web应用程序可能会超时并且SQL查询可能会继续。

1

之前执行查询时,SQL Server 估计它需要多少内存来运行 并试图从缓冲池保留的内存量 。如果 保留成功,则立即执行查询 。如果没有 足够的内存,随时可从 缓冲池,然后将查询放在 成队列超时值, 其中超时值由 查询成本导向。基本规则是: 估计成本越高,越大值越大 。 当此查询的等待时间超过 超时值时,超时错误是 抛出并且查询从 队列中删除。

Source

+0

在问题中提及30秒表示OP询问命令超时(来自客户端)而不是内存授予超时或锁定超时。 – 2011-04-27 21:32:25

+0

内存授予超时与ADO.Net客户端请求超时不同,即OP所指的30秒 – 2011-04-27 22:32:25

-3

通常当超时则表示连接已经死亡,这意味着该查询尚未发送到数据库中,大多数数据库支持事务处理,你就可以开始交易,运行查询,如果你感到高兴,你可以提交。

实施例:

BEGIN TRAN 

UPDATE authors 
    SET au_fname = 'John' 
WHERE au_id = '172-32-1176' 

UPDATE authors 
    SET au_fname = 'Marg' 
WHERE au_id = '213-46-8915' 

COMMIT TRAN 
+0

在这种情况下,连接仍处于打开状态,但数据库处于高负载状态,导致查询需要很长时间。 – sooprise 2011-04-27 21:37:52

+0

你在说连接超时或什么的吗?这与命令超时不同。 – 2011-04-27 21:48:25

+0

我的观点是,如果他与服务器建立连接,并且他需要确保他们转到实际的数据库,那么使用事务将有助于防止有时可能由于超时而导致的错误 – RobertPitt 2011-04-27 21:55:44

2

当客户决定该命令已运行足够长的时间,它会发出“中止”。查询只是停止在数据库中运行。

任何CATCH块都不会被命中,即使连接关闭,因为“close”表示“返回到连接池”,事务将保持打开状态,并且在此之后锁仍然可以保持分配状态。

如果你期望很多命令超时的则可以考虑使用SET XACT_ABORT ONand this too)是释放锁,并回滚事务。或修复代码...

+0

您说:“查询只停止在数据库中运行”;马丁史密斯的回答说:“它不会停止当前正在执行的查询 - 服务器在下次可用的机会中放弃正在为连接执行的任何操作”。哪个是对的? – simonp 2017-03-22 12:28:57

+0

同样的结果,不同的语言。我的“停止”可能会因为服务器负载,空中IO,WAIT等等而延迟 – gbn 2017-03-23 13:30:22

相关问题