Sql-Server

SQL Server 代理似乎以不同的方式對待 sysprocesses(和 dm_exec_sessions)

  • August 13, 2018

我有一個通過 SQL 代理作業執行的看門狗程序來管理一些自定義任務。其中一項檢查是該程序不再存在:

UPDATE R
SET IsOrphaned = 1, DebugTimestampUtc = GETUTCDATE()
FROM
   RequestTable AS R
   LEFT JOIN sys.sysprocesses AS P ON
       P.spid = R.SPID
WHERE P.spid IS NULL

在 SSMS 中,我執行此語句,然後在它完成之前關閉查詢視窗(取消查詢):

INSERT INTO RequestTable(SPID, CreateTimestampUtc, ...)
SELECT @@SPID, GETUTCDATE(), ...
WAITFOR DELAY '00:00:30.000'

當我手動執行查詢以標記 SSMS 中的孤兒時,它在行上匹配,但我的工作不匹配,正如RequestTable沒有將行標記為孤兒所證明的那樣。作業歷史顯示它按計劃執行,沒有任何錯誤,執行時間可以忽略不計(< 1 秒)。

此外,當我擴充孤兒檢測語句以查找P.status = 'sleeping'在我取消查詢時它立即檢測到的記錄INSERT ... WAITFOR ...(並保持查詢視窗打開)時。

SQL Server 是否有一些微妙的行為導致sys.sysprocessesSSMS 和 SQL 代理之間的表狀態明顯不一致?我也嘗試過使用和不使用 NOLOCK 查詢提示RequestTable

我在 SQL Server 2014 上以 2008R2 的兼容模式執行。

(請注意,使用sys.dm_exec_sessionsinstead 的行為仍然相同)

謝謝。

PS 這樣做的目的是為了序列化有並發問題的非同步程序。也許還有更好的方法來做到這一點(無法修復非同步程序)?

正如Aaron在評論中指出的那樣,目前會話被擷取,因為它們在連接池中被重用。

解決方案是過濾掉它:

AND session_id &lt;&gt; @@SPID

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