在SQL Server中强制查询超时

时间:2009-04-28 14:16:13

标签: sql-server testing timeout locking

我们遇到了一个代码块的问题,这个代码块在数据库缓慢的情况下响应很差(它在查询超时时陷入困境)。我们已经创建了一个补丁,并且正在通过回归运行它。

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

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

4 个答案:

答案 0 :(得分:119)

运行此操作,然后尝试插入...

select * from yourTable with (holdlock,tablockx)

在这里,您可以将其锁定5分钟:

BEGIN TRANSACTION

SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK)

WHERE 0 = 1

WAITFOR DELAY '00:05'

ROLLBACK TRANSACTION

答案 1 :(得分:26)

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

WaitFor Delay '00:01:00'

答案 2 :(得分:8)

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

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

  • Real:掷骰子的代码 - >数据库超时(难以重现)。
  • 重构:掷骰子的代码 - >存储库(仅限数据访问) - >数据库
  • 单元测试:掷骰子的代码> Mock repository投掷 - >空
  • 现在您对代码进行了测试失败,并且可以修复它。

这是“依赖”注入。开发人员可以将依赖项注入数据库,替换模拟依赖项行为的东西。很适合所有数据库测试。无论如何,在单元测试到位后,您知道修复程序确实应该是什么,但您仍需要进行集成测试。在这种情况下,它可能更好地专注于回归 - 这意味着测试它没有破坏任何其他东西,该功能仍然有效。

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

答案 3 :(得分:5)

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

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