如果超时,查询会发生什么?

时间:2011-04-27 21:23:38

标签: c# sql sql-server

假设我有一个发送到我的SQL-Server数据库的查询,它需要超过30秒,并且我的程序抛出SQL Query Timeout异常。查询是否仍在我的数据库中继续存在,或者一旦抛出异常就会终止它?

5 个答案:

答案 0 :(得分:16)

  

客户端发出查询超时信号   服务器使用注意事件。   注意事件只是一个   不同类型的TDS包是一种SQL   服务器客户端可以发送给它。在   除了连接/断开,T-SQL   批处理和RPC事件,客户端可以   发出关注服务器的信号。一个   注意告诉服务器取消   连接当前正在执行   一旦查询(如果有的话)   可能。注意不是   回滚打开的事务,它   不会停止当前正在执行的   查询一角钱 - 服务器中止   无论它为此做什么   在下一个可用的连接   机会。通常,这会发生   很快,但并非总是如此。

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

答案 1 :(得分:3)

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

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

如果您期望大量命令超时,请考虑使用SET XACT_ABORT ONand this too发布锁定和回滚事务。或修复代码...

答案 2 :(得分:2)

  

在执行查询之前,SQL Server   估计它需要多少内存   运行并尝试保留此金额   来自缓冲池的内存。如果   保留成功查询是   立即执行。如果没有   足够的记忆容易从   缓冲池,然后放置查询   进入具有超时值的队列,   超时值引导的位置   查询成本。基本规则是:   估计成本越高,越大   超时值是。 当   此查询的等待时间超过了   超时值,超时错误   抛出并从中删除查询   队列。

Source

答案 3 :(得分:0)

如果您获得SQL超时,则SQL已停止,但Web应用程序可能会超时并且SQL查询可以继续。

答案 4 :(得分:-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