首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置LOCK_TIMEOUT,是基于会话还是基于语句?

设置LOCK_TIMEOUT,是基于会话还是基于语句?
EN

Database Administration用户
提问于 2012-01-25 02:32:30
回答 3查看 9.1K关注 0票数 6

LOCK_TIMEOUT的持续时间是在什么时候?

登录后,我在一个命令中执行一个SET LOCK_TIMEOUT 10和一个SELECT @@LOCK_TIMEOUT,然后返回10。紧接着,我又做了一个SELECT @@LOCK_TIMEOUT,它返回-1。我还以为是10岁呢。

我在MSDN站点上做了一些查找,无法找到LOCK_TIMEOUT是基于会话的还是基于语句的。

EN

回答 3

Database Administration用户

回答已采纳

发布于 2012-01-25 09:24:16

您的应用程序是否通过sp_executesql提交其查询?(如果不确定,可以在Profiler中查看此信息)

代码语言:javascript
复制
EXEC sp_executesql N'SET LOCK_TIMEOUT 10; 
                     SELECT @@LOCK_TIMEOUT';

SELECT @@LOCK_TIMEOUT;

返回

代码语言:javascript
复制
-----------
10

-----------
-1

对我来说。

exec sp_prepexec中,我也看到了同样的行为

代码语言:javascript
复制
declare @p1 int

exec sp_prepexec @p1 output,
                 NULL,
                 N'SET LOCK_TIMEOUT 10; SELECT @@LOCK_TIMEOUT AS LOCK_TIMEOUT_INSIDE' 

select @p1 AS handle, @@LOCK_TIMEOUT AS LOCK_TIMEOUT_OUTSIDE
票数 3
EN

Database Administration用户

发布于 2012-01-25 03:30:20

来自SET LOCK_TIMEOUT联机丛书条目:

“在连接开始时,此设置的值为-1。更改后,新设置对连接的其余部分仍然有效。”

我所做的所有测试都反映了这种有记录的行为。也许您正在使用不同的连接,但获得相同的会话id?使用此查询检查:

代码语言:javascript
复制
SELECT 
    dec.connection_id, 
    dec.connect_time 
FROM sys.dm_exec_connections AS dec 
WHERE 
    dec.session_id = @@SPID;
票数 4
EN

Database Administration用户

发布于 2018-07-26 04:15:23

尽管SET LOCK_TIMEOUT文档目前说它将对连接的其余部分有效,但这并不完全正确。它遵循与其他SET语句相同的规则。

如果在存储过程或触发器中运行SET语句,则在从存储过程或触发器返回控件后恢复SET选项的值。此外,如果在使用sp_executesql或EXECUTE运行的动态SQL字符串中指定了SET语句,则在从动态SQL字符串中指定的批处理返回控件后恢复SET选项的值。

https://learn.microsoft.com/en-us/sql/t-sql/statements/set-statements-transact-sql

此外,根据运行查询的方式,您可能正在使用连接池。这可以为您提供相同的@@spid,但在从池中检索连接时执行exec sp_reset_connection操作。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/11511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档