在 SQL Server 中强制查询超时

问题描述 投票:0回答:5

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

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

我可以通过T-SQL轻松获得表级锁吗?还是我必须在master上摆弄?或者我可以在不锁定的情况下轻松强制超时吗?任何意见都将受到赞赏。

sql-server testing timeout locking
5个回答
145
投票

运行此命令,然后尝试插入...

select * from yourTable with (holdlock,tablockx)

这里,可以锁定5分钟:

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION

40
投票

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

WaitFor Delay '00:01:00'

11
投票

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

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

  • 真实:代码糟糕 -> 数据库超时(难以重现)。
  • 重构:糟糕的代码 -> 存储库(仅进行数据访问) -> 数据库
  • 单元测试:代码乱七八糟 > 模拟存储库抛出 -> null
  • 现在你的代码测试失败了,但可以修复它。

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

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


6
投票

查看 2005 年 10 月 20 日的博客文章 “不存在查询超时这样的事情...” 作者:Ken Henderson。基本上,SQL Server 没有查询超时。客户端可以强制执行 SQL 超时,但引擎本身不会。


0
投票

WHERE 0 = 1 在这里意味着什么?

© www.soinside.com 2019 - 2024. All rights reserved.