在 SQL Server 中强制查询超时

Posted

技术标签:

【中文标题】在 SQL Server 中强制查询超时【英文标题】:Forcing a query timeout in SQL Server 【发布时间】:2010-10-22 08:13:07 【问题描述】:

我们遇到了一个代码块的问题,该代码块在面对慢速数据库时响应不佳(它在查询超时时使床变得糟糕)。我们已经创建了一个补丁,并且正在通过回归运行它。

我们无法获得超时。我从 SQL Mgmt Studio 打开了一个事务并更新了每一行以锁定它们,但这不会导致 INSERT 超时(这是我需要的)。

我可以通过 T-SQL 轻松获得表级锁吗?还是我必须在主人身上摆弄?或者我可以轻松地强制超时而不锁定?任何意见表示赞赏。

【问题讨论】:

【参考方案1】:

运行它,然后尝试插入...

select * from yourTable with (holdlock,tablockx)

这里,你可以锁定5分钟:

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION

【讨论】:

有没有办法从 C#/.NET 做到这一点,而不会阻塞调用 SQL Server 的线程?我正在尝试在获取连接超时时测试我的应用程序的行为。但是如果我从 C# 调用这段代码,我不知道如何运行另一个查询,故意遇到超时。【参考方案2】:

你可以告诉你的 sql 代码在返回前等待一分钟:

WaitFor Delay '00:01:00'

【讨论】:

投票赞成答案的简单性。我已经测试过了,它可以工作 我正在填充一个表,并创建复杂的递归查询,buff,废话。这些可以解决问题。【参考方案3】:

另一方面:如果连接是可配置的,则将连接字符串超时时间减少到 1 秒 - 这样会更容易。用大量数据填充表,并让其他 3 个进程在循环中旋转,使用循环周围的事务更新该表的块。不要更改应用程序调用的实际过程(注入 waitfor)。这会使集成测试无效。

但实际上,这是一个支持单元测试和依赖注入的案例研究。有些东西很难集成测试。单元测试+dependency injection.

真实:废话代码 -> 数据库超时(难以重现)。 重构:废话代码 -> 存储库(仅进行数据访问)->数据库 单元测试:废话代码 > Mock repository to throw -> null 现在您的代码测试失败,可以修复它。

这是“依赖”注入。开发人员可以将依赖项注入数据库,替换一些模拟依赖项行为的东西。对所有数据库测试都很好。无论如何,有了单元测试,您就知道修复程序做了它应该做的事情,但您仍然需要集成测试。在这种情况下,它可能会更好地专注于回归 - 这意味着测试它没有破坏其他任何东西并且该功能仍然有效。

您已经创建了补丁,所以我想我的回答为时已晚。

【讨论】:

【参考方案4】:

查看这篇博文。基本上 SQL Server 没有查询超时。客户端可能会强制执行 SQL 超时,但引擎本身不会。

http://blogs.msdn.com/khen1234/archive/2005/10/20/483015.aspx

【讨论】:

blogs.msdn.com/khen1234/archive/2005/10/20/483015.aspx 未找到

以上是关于在 SQL Server 中强制查询超时的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server-聚焦强制索引查询条件和Columnstore Index

如何强制 SQL Server 以特定顺序执行查询

强制SQL Server执行计划使用并行提升在复杂查询语句下的性能

如何强制 SQL Server 2005 在 where 之前运行连接?

如何强制 SQL Server 在 WHERE 子句之前处理 CONTAINS 子句?

Sql Server 强制断开数据库已有连接的方法