是否可以在Microsoft SQL Server上为SQL查询设置超时?

Vil*_*lx- 8 sql-server timeout

我有一个场景,有时用户选择正确的参数并进行一个需要几分钟或更长时间才能执行的查询.我不能阻止他选择这样的参数组合(这是非常合法的),所以我想在查询上设置超时.

请注意,我真的想要停止查询执行本身并回滚任何事务,否则它会占用大部分服务器资源.添加一个不耐烦的用户,他重新启动应用程序并再次尝试组合,并且你有一个灾难的配方(读取:sql server DoS).

可以这样做,怎么做?

Ode*_*ded 7

据我所知,除了在客户端设置的命令或连接超时,没有办法通过查询基础的服务器来更改的查询超时.

您确实可以使用更改默认的600秒sp_configure,但这些是服务器作用域.

  • 您应该阐明服务器作用域的含义.SQL Serve具有远程查询超时值,该值指的是在链接服务器上发出的查询,而不是客户端向其发出的查询.我相信查询超时是客户端属性,而不是服务器属性.服务器无限期地运行查询.有一种查询调控器可以解决此问题,默认情况下会禁用此问题. (5认同)

小智 7

嗯!您是否尝试过 LOCK_TIMEOUT
在运行查询之前记下它的 原始内容 运行
查询
后将其设置为您的查询 将其设置回原始值

SET LOCK_TIMEOUT 1800;  
SELECT @@LOCK_TIMEOUT AS [Lock Timeout];  
Run Code Online (Sandbox Code Playgroud)


Yog*_*rtu 5

我可能会建议两件事。

\n\n

1)\n如果您的查询由于使用多个可能涉及锁的表而花费大量时间,那么一个相当快速的解决方案是使用“NoLock”提示运行查询。

\n\n

只需Select * from YourTable WITH (NOLOCK)在所有表引用中添加一个即可防止查询阻塞并发事务。

\n\n

2)如果你想确保所有查询的运行时间(让\xc2\xb4s说)少于5秒,那么你可以添加@talha建议的内容,这对我来说很有效

\n\n

只需在执行的顶部添加

\n\n
SET LOCK_TIMEOUT 5000;   --5 seconds.\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将导致你的查询需要少于 5 个或失败。然后你应该捕获异常并在需要时回滚。

\n\n

希望能帮助到你。

\n