Eu tenho um processo de watchdog que é executado por meio de um trabalho do SQL Agent para gerenciar algumas tarefas personalizadas. Uma das verificações é que o processo não existe mais:
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
No SSMS, executo esta instrução e fecho a janela de consulta antes que ela seja concluída (cancelando a consulta):
INSERT INTO RequestTable(SPID, CreateTimestampUtc, ...)
SELECT @@SPID, GETUTCDATE(), ...
WAITFOR DELAY '00:00:30.000'
Quando executo manualmente a consulta para sinalizar órfãos no SSMS, ela corresponde na linha, mas meu trabalho não , como é evidenciado pela RequestTable
não marcação da linha como órfã. O histórico da tarefa mostra a execução conforme programado sem erros, com tempo de execução insignificante (< 1 segundo).
Além disso, quando eu aumento a instrução de detecção de órfãos para também encontrar registros onde P.status = 'sleeping'
ela detecta imediatamente quando eu cancelo a INSERT ... WAITFOR ...
consulta (e mantenho a janela de consulta aberta).
Existe algum comportamento sutil do SQL Server causando esse estado aparentemente inconsistente da sys.sysprocesses
tabela entre o SSMS e o SQL Agent? Eu também tentei com e sem uma dica de consulta NOLOCK no RequestTable
.
Estou executando o SQL Server 2014 em modo de compatibilidade para 2008R2.
(Observe que usar sys.dm_exec_sessions
em vez disso ainda se comporta da mesma forma)
Obrigado.
PS O objetivo disso é serializar processos assíncronos que têm problemas de simultaneidade. Talvez haja também uma maneira melhor de fazer isso (sem poder corrigir os processos assíncronos)?
Conforme apontado nos comentários de Aaron , a sessão atual estava sendo capturada, pois são reutilizadas no pool de conexões.
A solução é filtrá-lo: