在SQL Server中强制查询超时


79

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

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

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

Answers:


131

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

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#调用此代码,我将不知道如何运行另一个查询,有意地遇到了超时问题。
杰克·史密斯

33

您只需告诉您的sql代码一分钟后再返回:

WaitFor Delay '00:01:00'

为答案的简单而投票。我已经对其进行了测试,并且可以正常工作
Mikel

我正在填充一个表,并创建复杂的递归查询,buff,废话。这些就可以了。
DanielV

10

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

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

  • 实数:代码混乱->数据库超时(难以重现)。
  • 重构:爬网的代码->存储库(仅进行数据访问)->数据库
  • 单元测试:弄皱的代码>要抛出的模拟存储库-> null
  • 现在,您的代码失败了,并且可以解决它,因此测试失败。

这是“依赖”注入。开发人员可以将依赖项注入到数据库中,以替代模拟依赖项行为的内容。非常适合所有数据库测试。无论如何,在进行单元测试的情况下,您知道该修复确实可以实现,但是您仍然需要进行集成测试。在这种情况下,最好将焦点放在回归上-这意味着对其进行测试不会破坏其他任何功能,并且该功能仍然有效。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.