Sql-Server
SQL Server 代理似乎以不同的方式對待 sysprocesses(和 dm_exec_sessions)
我有一個通過 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.sysprocesses
SSMS 和 SQL 代理之間的表狀態明顯不一致?我也嘗試過使用和不使用 NOLOCK 查詢提示RequestTable
。我在 SQL Server 2014 上以 2008R2 的兼容模式執行。
(請注意,使用
sys.dm_exec_sessions
instead 的行為仍然相同)謝謝。
PS 這樣做的目的是為了序列化有並發問題的非同步程序。也許還有更好的方法來做到這一點(無法修復非同步程序)?
正如Aaron在評論中指出的那樣,目前會話被擷取,因為它們在連接池中被重用。
解決方案是過濾掉它:
AND session_id <> @@SPID