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

What Happens To a Query If It Times Out?

提问人:sooprise 提问时间:4/28/2011 更新时间:9/23/2022 访问量:8198

问:

假设我有一个发送到我的 SQL-Server 数据库的查询,它花费了 30 多秒的时间,并且我的程序引发了 SQL 查询超时异常。查询是否仍在我的数据库上运行,还是在引发异常后立即终止?

C# SQL 服务器

评论


答:

0赞 Dustin Laine 4/28/2011 #1

如果遇到 SQL 超时,则 SQL 已停止,但 Web 应用程序可能会超时,SQL 查询可以继续。

1赞 Richard Nienaber 4/28/2011 #2

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

评论

0赞 Martin Smith 4/28/2011
问题中提到的 30 秒表示 OP 询问的是命令超时(来自客户端),而不是内存授予超时或锁定超时。
0赞 Remus Rusanu 4/28/2011
内存授予超时与 ADO.Net 客户端请求超时不同,后者是 OP 所指的 30 秒
-3赞 RobertPitt 4/28/2011 #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 4/28/2011
在这种情况下,连接仍处于打开状态,但数据库负载较重,导致查询时间过长。
0赞 Martin Smith 4/28/2011
你说的是连接超时还是什么?这与命令超时不同。
0赞 RobertPitt 4/28/2011
我的观点是,如果他与服务器建立连接,并且他需要确保它们被扔到实际的数据库,那么使用事务将有助于防止有时可能由超时引起的错误
0赞 Martin Smith 4/28/2011
您的第一句话谈到“意味着查询尚未发送到数据库”,这是否表明与我的连接本身存在问题?然后,当它停止尝试连接时,将由连接超时属性控制。命令超时发生在运行耗时的批处理时,由客户端库实现。它们在处理未结交易的方式上各不相同
4赞 gbn 4/28/2011
-1 表示完全混乱。事务将在命令超时时保持打开状态
21赞 Martin Smith 4/28/2011 #4

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

来源链接:没有查询超时之类的东西......

4赞 gbn 4/28/2011 #5

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

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

如果您预计会有很多命令超时,请考虑使用 SET XACT_ABORT ON这也是),这将释放锁定和回滚事务。或修复代码...

评论

0赞 simonp 3/22/2017
您说“查询只是在数据库中停止运行”;马丁·史密斯(Martin Smith)的回答是“它不会停止当前正在执行的查询 - 服务器会在下一个可用机会中止它为连接所做的任何事情”。哪个是正确的?
0赞 gbn 3/23/2017
相同的结果,不同的语言。我的“停止”可能会根据服务器负载、飞行中 IO、任何 WAIT 等因素而延迟