Sql-Server

SET LOCK_TIMEOUT,是基於會話還是基於語句?

  • July 26, 2018

最後的時間是LOCK_TIMEOUT多少?

我在登錄後執行一個SET LOCK_TIMEOUT 10和一個命令並返回 10。SELECT @@LOCK_TIMEOUT緊接著我又做了SELECT @@LOCK_TIMEOUT一次,它返回-1。我還以為還是10。

我在 MSDN 網站上做了一些查找,但找不到LOCK_TIMEOUT是基於會話還是基於語句。

您的應用程序是否通過 送出查詢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

SET LOCK_TIMEOUT聯機叢書條目:

“在連接開始時,此設置的值為 -1。更改後,新設置對連接的其餘部分保持有效。”

我進行的所有測試都反映了這種記錄在案的行為。也許您正在使用不同的連接但獲得相同的會話 ID?使用此查詢檢查:

SELECT 
   dec.connection_id, 
   dec.connect_time 
FROM sys.dm_exec_connections AS dec 
WHERE 
   dec.session_id = @@SPID;

引用自:https://dba.stackexchange.com/questions/11511