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

假设我有一个发送到我的SQL-Server数据库的查询,它需要超过30秒,并且我的程序抛出SQL Query Timeoutexception。 查询是否仍然在我的数据库上进行,或者在抛出exception后立即终止?

客户端使用注意事件向服务器发出查询超时信号。 注意事件只是SQL Server客户端可以发送给它的不同类型的TDS数据包。 除了连接/断开连接,T-SQL批处理和RPC事件之外,客户端还可以发出对服务器的注意信号。 注意告诉服务器尽快取消连接当前正在执行的查询(如果有)。 注意不会回滚打开的事务,并且它不会停止当前正在执行的查询 – 服务器会在下一个可用机会中止它为连接所做的任何操作。 通常,这种情况很快发生,但并非总是如此。

来源没有查询超时这样的事情……

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

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

如果你期望很多命令超时,那么考虑使用SET XACT_ABORT ON ( 这也是 ) 释放锁和回滚事务。 或修复代码……

在执行查询之前,SQL Server估计需要运行多少内存并尝试从缓冲池中保留此内存量。 如果保留成功,则立即执行查询。 如果缓冲池中没有足够的可用内存,则将查询放入具有超时值的队列中,其中超时值由查询开销引导。 基本规则是:估计成本越高,超时值越大。 当此查询的等待时间超过超时值时,将引发超时错误,并从队列中删除查询。

资源

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

通常当它超时意味着连接已经死亡,这意味着查询尚未发送到数据库,大多数数据库支持事务,您可以在其中启动事务,运行查询,如果您满意,则可以提交它们。

例:

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