LOCK_TIMEOUT的持续时间是在什么时候?
登录后,我在一个命令中执行一个SET LOCK_TIMEOUT 10和一个SELECT @@LOCK_TIMEOUT,然后返回10。紧接着,我又做了一个SELECT @@LOCK_TIMEOUT,它返回-1。我还以为是10岁呢。
我在MSDN站点上做了一些查找,无法找到LOCK_TIMEOUT是基于会话的还是基于语句的。
发布于 2012-01-25 09:24:16
您的应用程序是否通过sp_executesql提交其查询?(如果不确定,可以在Profiler中查看此信息)
EXEC sp_executesql N'SET LOCK_TIMEOUT 10;
SELECT @@LOCK_TIMEOUT';
SELECT @@LOCK_TIMEOUT;返回
-----------
10
-----------
-1对我来说。
在exec sp_prepexec中,我也看到了同样的行为
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发布于 2012-01-25 03:30:20
来自SET LOCK_TIMEOUT联机丛书条目:
“在连接开始时,此设置的值为-1。更改后,新设置对连接的其余部分仍然有效。”
我所做的所有测试都反映了这种有记录的行为。也许您正在使用不同的连接,但获得相同的会话id?使用此查询检查:
SELECT
dec.connection_id,
dec.connect_time
FROM sys.dm_exec_connections AS dec
WHERE
dec.session_id = @@SPID;发布于 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操作。
https://dba.stackexchange.com/questions/11511
复制相似问题