假设我有一个发送到我的SQL-Server数据库的查询,它需要超过30秒,并且我的程序抛出SQL Query Timeout异常。查询是否仍在我的数据库中继续存在,或者一旦抛出异常就会终止它?
答案 0 :(得分:16)
客户端发出查询超时信号 服务器使用注意事件。 注意事件只是一个 不同类型的TDS包是一种SQL 服务器客户端可以发送给它。在 除了连接/断开,T-SQL 批处理和RPC事件,客户端可以 发出关注服务器的信号。一个 注意告诉服务器取消 连接当前正在执行 一旦查询(如果有的话) 可能。注意不是 回滚打开的事务,它 不会停止当前正在执行的 查询一角钱 - 服务器中止 无论它为此做什么 在下一个可用的连接 机会。通常,这会发生 很快,但并非总是如此。
答案 1 :(得分:3)
当客户端确定命令运行的时间足够长时,它会发出“Abort”。查询只是停止在数据库中运行。
任何CATCH块都不会被命中,事务将保持打开状态,并且锁定仍然可以在此之后保持分配,即使连接已关闭,因为“关闭”意味着“返回连接池”。
如果您期望大量命令超时,请考虑使用SET XACT_ABORT ON(and this too)将发布锁定和回滚事务。或修复代码...
答案 2 :(得分:2)
在执行查询之前,SQL Server 估计它需要多少内存 运行并尝试保留此金额 来自缓冲池的内存。如果 保留成功查询是 立即执行。如果没有 足够的记忆容易从 缓冲池,然后放置查询 进入具有超时值的队列, 超时值引导的位置 查询成本。基本规则是: 估计成本越高,越大 超时值是。 当 此查询的等待时间超过了 超时值,超时错误 抛出并从中删除查询 队列。
答案 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