在SQL Server中强制查询超时

我们遇到了一个代码块,在缓慢的数据库中响应不佳的问题(它在查询超时时间上喋喋不休)。 我们已经创build了一个补丁,并且正在通过回归运行它。

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

我可以通过T-SQL轻松获得表级锁吗? 还是我不得不在主人身边摆弄? 或者我可以很容易地强制超时没有locking? 任何input赞赏。

运行这个,然后尝试插入…

select * from yourTable with (holdlock,tablockx) 

在这里,你可以locking5分钟:

 BEGIN TRANSACTION SELECT * FROM yourTable WITH (TABLOCKX, HOLDLOCK) WHERE 0 = 1 WAITFOR DELAY '00:05' ROLLBACK TRANSACTION 

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

 WaitFor Delay '00:01:00' 

在提示方面:如果连接是可configuration的,请将连接string超时减less到1秒 – 这样会更容易。 用大量的数据填充表,并有3个其他进程在一个循环中旋转,用循环中的事务更新该表的块。 不要改变应用程序调用的实际过程(注入waitfor)。 这使集成testing无效。

但实际上,这是一个有利于unit testing和dependency injection的案例研究。 有些事情很难整合testing。 unit testing+ dependency injection 。

  • 真实:代码,胡扯 – >数据库超时(难以重现)。
  • 重构:代码craps – >存储库(只有数据访问) – >数据库
  • unit testing:代码cra> 模拟库抛出 – > null
  • 现在你有一个testing失败的代码,可以修复它。

这是“依赖”注入。 开发人员可以将依赖关系注入数据库,代替模拟依赖关系行为的东西。 所有数据库testing都很好。 无论如何,通过unit testing,你知道修复确实应该做什么,但是你仍然需要一个集成testing。 在这种情况下,它可能更好地关注于回归 – 这意味着testing它不会破坏任何其他function,并且function仍然有效。

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

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

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